“int * path”和“int path []”之间有什么区别?

时间:2012-12-04 06:22:39

标签: c sigsegv

  

可能重复:
  Similarities and differences between arrays and pointers through a practical example

我过去常常将它们视为数组名称。但是现在我遇到了一个错误,就是当我使用int *path并尝试访问数组成员时,编译器会得到一个SIGSEGV(我以前从未记得曾经记得的代码) ,但是当我使用int path[]时,我没关系。

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

3 个答案:

答案 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的原因。

感谢。