我知道这可能是一个常见的问题,但我试图搜索但仍然找不到明确的答案.
我有以下代码:
int* f() {
int a[] = {1,2,3};
return a;
}
int main() {
int a[] = f(); // Error here
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码生成错误消息:" Cannot convert from 'int *' to 'int []'"
我发现这很奇怪,因为我已经读过指针和数组是相似的.例如,我们可以使用[i]代替*(a + i).请问有人能给我一个明确的解释吗?
Ale*_*ler 21
这段代码实际上有两个错误.
首先,您将返回临时(int数组f)的地址,因此在函数返回后其内容未定义.任何尝试访问返回指针指向的内存都将导致未定义的行为.
其次,在C++中没有从指针到数组类型的隐式转换.它们相似但不完全相同.数组可以衰减到指针,但它不会反过来因为信息在路上丢失 - 指针只代表一个内存地址,而数组代表连续区域的地址,通常具有特定的大小.您也无法分配给数组.
例如,我们可以用[i]代替*(a + i)
然而,这与数组和指针之间的差异几乎没有关系,它只是指针类型的语法规则.当数组衰减为指针时,它也适用于数组.
Mat*_*lia 11
该类型int[]实际上并不存在.
定义和初始化数组时
int a[] = {1,2,3};
Run Code Online (Sandbox Code Playgroud)
编译器对初始化程序中的元素进行计数,并创建一个正确大小的数组; 在这种情况下,它神奇地变成:
int a[3] = {1,2,3};
Run Code Online (Sandbox Code Playgroud)
int[]用作函数的参数,相反,它只是简单的int *,即指向数组的第一个元素的指针.没有其他信息,特别是没有保留大小.返回指针时也一样
请注意,数组不是指针:指针可以更改为指向其他内容,而数组总是指向同一个内存; 指针不知道它指向的内存空间有多大,而数组的大小在编译时总是知道的.混淆源于这样一个事实:在许多情况下,数组衰减到指向其第一个元素的指针,并将它传递给函数/从函数返回它是这些情况中的一些.
那么,为什么你的代码不起作用?有两个大错误:
您正在尝试使用指针初始化数组.我们说a int *不带有关于阵列大小的任何信息.它只是指向第一个元素的指针.所以编译器无法知道a应该有多大来容纳返回的东西f().
在f您返回指向该函数本地变量的指针.这是错误的,因为指针实际上并不存储数据,它只指向数据存储的位置,即在你的情况下指向a本地f.因为该数组是函数的本地数组,所以当函数退出时(即在函数处return),它就不再存在.
这意味着您返回的指针指向不再存在的内容; 考虑代码:
int * a = f();
Run Code Online (Sandbox Code Playgroud)
这个初始化有效,你可以尝试a稍后在函数中使用,但是a会指向不再存在的数组f; 在最好的情况下,你的程序会崩溃(你会立即注意到你做错了什么),最坏的情况似乎会工作一段时间,然后开始给出奇怪的结果.