-1

可能的重复:
通过一个实例说明数组和指针的异同

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

那么为什么我在使用时会得到一个 SIGSEGVint *path呢?

4

3 回答 3

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 */     

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

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

编辑

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

于 2012-12-04T06:33:47.873 回答
0
int *path = { 4, 5, 3, -1}; 

当您执行上述操作时,数据将存储在只读存储器中。因此,当您尝试使用该指针更改任何索引时,您将获得一个 sigsegv。

但是当你这样做时

int path[]={...};

它将存储在非只读的静态内存中,您可以在其中修改数组中的数据

于 2012-12-04T06:40:52.777 回答
0
  • int path[]: 路径指向实际数组
  • int *path: path 只是一个内存指针。的内存位置path可能不包含实际的数组。

我打赌你正在尝试mktemp()使用char *path. 我已经做过很多次了。:-( 其他人解释了这个SEGV的原因。

谢谢。

于 2012-12-04T06:44:53.810 回答