无法从'int*'转换为'int []'?

ipk*_*iss 9 c c++ pointers

我知道这可能是一个常见的问题,但我试图搜索但仍然找不到明确的答案.

我有以下代码:

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 *,即指向数组的第一个元素的指针.没有其他信息,特别是没有保留大小.返回指针时也一样

请注意,数组不是指针:指针可以更改为指向其他内容,而数组总是指向同一个内存; 指针不知道它指向的内存空间有多大,而数组的大小在编译时总是知道的.混淆源于这样一个事实:在许多情况下,数组衰减到指向其第一个元素的指针,并将它传递给函数/从函数返回它是这些情况中的一些.

那么,为什么你的代码不起作用?有两个大错误:

  1. 您正在尝试使用指针初始化数组.我们说a int *不带有关于阵列大小的任何信息.它只是指向第一个元素的指针.所以编译器无法知道a应该有多大来容纳返回的东西f().

  2. f您返回指向该函数本地变量的指针.这是错误的,因为指针实际上并不存储数据,它只指向数据存储的位置,即在你的情况下指向a本地f.因为该数组是函数的本地数组,所以当函数退出时(即在函数处return),它就不再存在.

    这意味着您返回的指针指向不再存在的内容; 考虑代码:

    int * a = f();
    
    Run Code Online (Sandbox Code Playgroud)

    这个初始化有效,你可以尝试a稍后在函数中使用,但是a会指向不再存在的数组f; 在最好的情况下,你的程序会崩溃(你会立即注意到你做错了什么),最坏的情况似乎会工作一段时间,然后开始给出奇怪的结果.