可能的重复:
通过一个实例说明数组和指针的异同
我曾经将它们视为相同的数组名称。但是现在我遇到了一个错误,就是当我使用int *path
并尝试访问数组的成员时,编译器得到一个SIGSEGV(我之前写的代码中我从来不记得发生过),但是我没关系当我使用int path[]
.
那么为什么我在使用时会得到一个 SIGSEGVint *path
呢?
可能的重复:
通过一个实例说明数组和指针的异同
我曾经将它们视为相同的数组名称。但是现在我遇到了一个错误,就是当我使用int *path
并尝试访问数组的成员时,编译器得到一个SIGSEGV(我之前写的代码中我从来不记得发生过),但是我没关系当我使用int path[]
.
那么为什么我在使用时会得到一个 SIGSEGVint *path
呢?
只是猜测您正在尝试写入您以两种可能但不等效的方式声明的数组:
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 []) 才能在没有警告的情况下进行编译。然后,让我们假设该数组是在您无法写入的地方创建的,尽管事实并非如此。
int *path = { 4, 5, 3, -1};
当您执行上述操作时,数据将存储在只读存储器中。因此,当您尝试使用该指针更改任何索引时,您将获得一个 sigsegv。
但是当你这样做时
int path[]={...};
它将存储在非只读的静态内存中,您可以在其中修改数组中的数据
int path[]
: 路径指向实际数组int *path
: path 只是一个内存指针。的内存位置path
可能不包含实际的数组。我打赌你正在尝试mktemp()
使用char *path
. 我已经做过很多次了。:-( 其他人解释了这个SEGV的原因。
谢谢。