繁体   English   中英

小C程序中的分段错误

[英]Segmentation fault in small C program

我正在写一个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指向指向p的指针p 通过分配*total ,您将分配给p total尚未初始化,因此您要将值分配到随机位置。 你需要初始化total - 例如

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

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

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

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

int *total[NUM_ARRAYS];

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

total[0] = a;

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

代码不一定总是给你一个分段错误。 当你申报时

     int *p

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

    *p=10 //say

你本质上是试图访问该位置。 如果位置超出了进程可访问的内存,则会出现分段错误。 如果该位置碰巧是可访问的,这将“破坏”该位置,并且您的程序行为神秘。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM