我正在写一个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和指针的新手。任何帮助将不胜感激。
答案 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
指向某事。你没有指定它指向的内容(它应该是另一个指针),但是你正在尝试向该位置写一些内容,因此错误。