1

我有小 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);
...
4

1 回答 1

2

您应该检查 的类型是否N与 的返回值匹配atoi()。避免依赖隐式类型转换,因为这可能会导致值变成您未预料到的东西的问题。

如果您在编译时带有所有警告 ( gcc -Wall),那么您可能应该会看到一个警告。您可以使用 GCC 打开其他警告,在文档中列出。编译带有警告是一个好习惯。

此外,在处理指针时养成错误检查的(好)习惯。每次调用后请务必检查是否成功分配内存。

换句话说:

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()。这应该有助于解决这种可能性。

于 2013-11-02T00:16:24.693 回答