3

我真的对数组和指针感到困惑。
请告诉我以下两个代码有什么区别?

int main()
{
    int i,*p;
    for(i=0;i<5;i++)
    {
        p[i]=i;
        printf("%d",p[i]);
    }
return 0;
}

int main()
{
    int i,p[5];
    for(i=0;i<5;i++)
    {
        p[i]=i;
        printf("%d",p[i]);
    }
return 0;
}
4

2 回答 2

7

第一个导致未定义的行为。对于没有UB,您需要使用malloc或分配内存calloc。分配内存会将数据存储在堆中。完成任务后,您还需要free分配内存。

第二个不会导致UB。它将数组数据存储在堆栈中而不是堆中。一旦作用域结束,内存会自动从堆栈中释放。

于 2013-07-05T12:25:30.257 回答
4

首先p指向垃圾位置(未分配),我很确定您使用它的方式会产生分段错误。您应该先分配内存,然后再使用它,例如:

p = malloc(5 * sizeof(int))

第二个是在堆栈上分配的,并且具有声明它的范围的生命周期。

于 2013-07-05T12:28:18.577 回答