小C程序中的分段错误

时间:2011-08-03 16:34:10

标签: c pointers segmentation-fault

我正在写一个C程序。它编译得很好,但是当我尝试运行二进制文件时,我得到一个seg错误。我运行gdb但是我在下一行遇到了问题

*total = a;

问题出在代码的开头。这是:

main(){
  int a[] = {1,1,1,0,0,0,0};
  int **total; //array of int arrays
  *total = a; //i.e. set total's first array to be a.

我是C和指针的新手。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:5)

total指向指向int的指针p。通过分配到*total,您将分配给p。但是total尚未初始化,因此您要将值分配到随机位置。您需要初始化total - 例如

int * p;
int** total = &p;

答案 1 :(得分:4)

您收到了段错误,因为total未初始化,因此*total指向内存中的随机空间。您想为总计分配空间:

total = malloc(sizeof (int *) * NUM_ARRAYS);

或者,您可以忽略指针并使总数成为一个数组:

int *total[NUM_ARRAYS];

将数组total降级为指向其第一个元素的指针,您可以这样使用它:

total[0] = a;

如果你认为指针包含变量的地址,事情可能会更清楚。

答案 2 :(得分:2)

代码不一定总能给你一个分段错误。当你宣布

     int *p

sizeof(int *)位分配给p。(在32位编译器的情况下,这是32。)p应该指向存储在分配空间中的任何内容。现在,因为您尚未初始化此值。所以这可能包含一些随机值。当你这样做

    *p=10 //say

您实际上是在尝试访问该位置。如果位置超出了进程可访问的内存,则会出现分段错误。如果该位置恰好可以访问,这将“破坏”该位置,并且您的程序会出现神秘行为。

答案 3 :(得分:0)

您尚未为total分配任何内存。如果total未初始化,则分配给*total会调用未定义的行为。幸运的是,你得到了一个段错误。只要你将内存分配给total(或者只是使用一个指针数组,因为我猜这是你的意图),它就可以正常工作。

答案 4 :(得分:0)

total指向某事。你没有指定它指向的内容(它应该是另一个指针),但是你正在尝试向该位置写一些内容,因此错误。