小C程序中的分段错误

小C程序中的分段错误,c,pointers,segmentation-fault,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和指针。任何帮助都将不胜感激。您尚未为总计分配任

我正在写一个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和指针。任何帮助都将不胜感激。

您尚未为
总计
分配任何内存。当
total
未初始化时,分配给
*total
将调用未定义的行为。幸运的是,你犯了一个错误。只要你把内存分配给
total
(或者仅仅使用一组指针,我猜这是你的意图),它就会工作得很好。

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

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

之所以出现segfault,是因为
total
未初始化,因此
*total
指向内存中的随机空间。您要为总计分配空间:

total = malloc(sizeof (int *) * NUM_ARRAYS);
或者,您可以忽略指针并将total设置为数组:

int *total[NUM_ARRAYS];
将数组
total
点降级为指向其第一个元素的指针,您可以这样使用它:

total[0] = a;

如果你把指针看作是保存变量地址的指针,事情可能会更清楚。

total
指向一些东西。您尚未指定它指向的对象(应该是另一个指针),但您正试图将某些内容写入该位置,因此出现了错误。

代码不必总是给出分段错误。当你申报时

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

    *p=10 //say
您实际上是在尝试访问该位置。如果该位置位于进程可访问的内存之外,则会出现分段错误。如果恰好可以访问该位置,这将“损坏”该位置,并且您的程序会神秘地运行