首页 文章

主要分段故障

提问于
浏览
1

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

分段故障(核心转储)

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

单步执行直到退出功能主,没有行号信息 . 程序接收信号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 回答

  • 2

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

    如果您使用所有警告( 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 甚至更大),你的系统在运行_1658099之前会耗尽内存 . 这应该有助于解决这种可能性 .

相关问题