可能重复:
Similarities and differences between arrays and pointers through a practical example
我过去常常将它们视为数组名称。但是现在我遇到了一个错误,就是当我使用int *path
并尝试访问数组成员时,编译器会得到一个SIGSEGV(我以前从未记得曾经记得的代码) ,但是当我使用int path[]
时,我没关系。
那么为什么我在使用int *path
时会得到一个SIGSEGV?
答案 0 :(得分:3)
猜测你是想写一个你用两种可能的,而不是等价的方式声明的数组:
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 */
在第一种情况下,path是指向放置在某处的“静态”“列表”的指针。您只有指向它的指针,可以读取内容,但如果您尝试在其上书写,则可能存在分段错误。 (可能因为这些数据可能存在于内存中,您可以写入,即使经常发生也不能,但这取决于系统)。
在第二种情况下,堆栈上的区域被保留,大到足以容纳数据,然后将其复制到该区域。在这种情况下,您可以读取和写入它。
修改强>
在注释中注意到第一个示例给出了警告,您将需要一个强制转换(int [])来编译而不会发出警告。然后,让我们假设数组是在无法写入的地方创建的,尽管情况可能并非如此。
答案 1 :(得分:0)
int *path = { 4, 5, 3, -1};
执行上述操作时,数据将在只读内存中显示。 因此,当您尝试使用该指针更改任何索引时,您将获得一个sigsegv。
但是当你做的时候
int path[]={...};
它将存储在非只读的静态存储器中,您可以在其中修改数组中的数据
答案 2 :(得分:0)
int path[]
:路径指向实际数组int *path
:path只是一个内存指针。 path
的内存位置可能不包含实际数组。我打赌你正在mktemp()
与char *path
一起尝试。我做了很多次。 :-(
其他人解释了这种SEGV的原因。
感谢。