C语言中数组和指针的区别是什么?

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;
}

1
@devnull 这与公平有什么关系?这只是可取的 - 如果你没有看到它发生,那可能是因为其他观众没有一个好的答案书签,或者一个更难找到的...只需用你自己的关闭投票开始它... - Tony Delroy
当我看到标题时,我很确定这是一个重复的问题,但当我看到描述时有些犹豫。不过,肯定有一些与根本原因相同的帖子隐藏在周围。但我意识到对于初学者可能很难将它们与他的问题联系起来。因此,我不会对此进行投票。 - phoeagon
嘿,请告诉我关于标志和投票的内容... - A.s. Bhullar
2个回答

7

第一种情况会导致未定义的行为。若要避免UB,您需要使用malloccalloc来分配内存。内存分配将在堆中存储数据。完成任务后,您需要使用free释放已分配的内存。

第二种情况不会导致UB。它将数组数据存储在堆栈中而不是堆上。当作用域结束时,内存会从堆栈自动释放。


非常感谢@Vijay,实际上我是C语言的新手,你能告诉我在哪里可以找到有关数据在堆栈中存储的更多信息吗? - A.s. Bhullar

4

在最开始,p 指向一个垃圾位置(未分配),我相信你按照这种方式使用它会导致分段错误。在使用之前,你应该先分配内存,例如:

p = malloc(5 * sizeof(int))

第二个变量被分配在堆栈上,其生命周期与其声明的作用域相同。

不一定是分段错误,而是未定义的行为,他的代码可能会运行,也可能会崩溃并生成核心转储文件。请参考Vijay的答案。 - Grijesh Chauhan
谢谢@Pavel.lazar和Grijesh Chauhan,你们能告诉我更多关于段错误的信息吗? - A.s. Bhullar
@A.s.Bhullar 为什么不读一下这个:段错误,读一下操作系统发送信号给进程并杀死它。 - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接