c - "int *path"和 "int path[]"之间有什么区别吗?

标签 c segmentation-fault

Possible Duplicate:
Similarities and differences between arrays and pointers through a practical example

我曾经将它们视为相同的数组名称。但是现在我遇到了一个错误,就是当我使用int *path时并尝试访问数组的成员,编译器得到一个 SIGSEGV(我从来不记得在我之前编写的代码中发生过),但是当我使用 int path[] 时就可以了.

那么为什么我在使用 int *path 时收到 SIGSEGV ?

最佳答案

只是猜测您正在尝试写入已以两种可能但不等效的方式声明的数组:

    int *path = { 4, 5, 3, -1}; /* you're saying this does not work ... when? */
 //  ^ compiler "warning" (error) expected, see edit below
    path[2] = 1;                /* .. when you try this */

但是

    int path[] = { 4, 5, 3, -1};
    path[2] = 1;                 /* but this works */     

在第一种情况下,路径是指向放置在某处的“静态”“列表”的指针。您只有指向它的指针,可以读取内容,但如果您尝试在其上写入,则可能会出现段错误。 (可能因为这些数据可能位于您可以写入的内存中,即使经常发生您不能写入的情况,但这取决于系统)。

在第二种情况下,堆栈上的一个区域被保留,足够大以容纳数据,然后将数据复制到该区域中。在这种情况下,您既可以读取也可以写入。

编辑

正如评论中所注意到的,第一个示例给出了警告,您将需要一个强制转换(int [])来编译而不发出警告。然后,让我们假设该数组是在无法写入的地方创建的,尽管事实并非如此。

关于c - "int *path"和 "int path[]"之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13697203/

相关文章:

c - 将指针改组为指向结构的指针

iphone - 由于 "Application exited abnormally with signal 9"或“应用程序异常退出,信号 11 : Segmentation fault"in Iphone 导致应用程序崩溃

c - 用 C 将项目插入堆栈

c - 右键单击图标时出现无限 gtk 警告

c - char * 的空终止

c - GCC 优化器在 nostdlib 代码中生成错误

c - 为什么++(*p) 没有给出 l-value required 错误?

无法在 C 中定义函数类型

linux - 汇编代码程序发生段错误

linux - 更改内核页面权限以允许用户访问