主要分段故障

时间:2013-11-02 00:10:36

标签: c segmentation-fault

我有小C程序。当我使用gcc编译它时,一切正常,但是当我尝试运行它时,我收到此消息:

Segmentation fault (core dumped)

当我在gdb and上放置断点并启动程序时,我尝试使用main()调试它,我在gdb中收到此消息:

  

单步执行直到从函数main退出,该函数没有行   号码信息。

     

编程接收信号SIGSEGV,分段故障。

     

0x00007ffff7a56ad4在? ()来自/lib/x86_64-linux-gnu/libc.so.6

这是我的mani()函数的开始:

int main(int argc, char **argv) {

   long N;
   double *A, *B, *C, t;

   srand(time(NULL));

   N = atoi(argv[1]);
   A = (double *) malloc(N * N * sizeof(double));
   B = (double *) malloc(N * N * sizeof(double));
   C = (double *) malloc(N * N * sizeof(double));
   matFillSimple(N, A, 1.0);
   matFillSimple(N, B, 2.0);
   matFillSimple(N, C, 0.0);
...

1 个答案:

答案 0 :(得分:2)

您应该检查N的类型是否与atoi()的返回值匹配。避免依赖隐式类型转换,因为这会导致价值变成您不期望的事情的问题。

如果您使用所有警告(gcc -Wall)进行编译,那么您可能会看到对此效果的警告。您可以使用GCC listed in the documentation启用其他警告。编写警告是一个良好的习惯。

此外,在处理指针时进入错误检查的(良好)习惯。确保在每次通话后检查是否成功分配了内存。

换句话说:

A = (double *) malloc(N * N * sizeof(double));
...

应该是这样的:

double *A = NULL;
A = malloc(N * N * sizeof(double));
if (!A) {
    fprintf(stderr, "ERROR: Could not allocate space for A\n");
    return EXIT_FAILURE;
}
...

对每个double指针重复一次。

我怀疑你的N的价值是如此之大(N * N甚至更大),你的系统在运行matFillSimple()之前会耗尽内存。这应该有助于解决这种可能性。