【问题标题】:Segmentation fault on main主要的分段错误
【发布时间】:2013-11-13 06:48:46
【问题描述】:

我有一个小的 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);
...

【问题讨论】:

  • 可以给我们matFillSimple的代码吗?
  • N的值是多少?
  • 在开始使用之前,您不会检查是否有argv[1]。这可能会导致你崩溃。在开始使用之前,您不会检查 N 是否合理。这也可能导致您崩溃。
  • 另外,atoi() 返回一个int,而N 是一个long
  • @AlexReynolds: atoi() 返回 int 很好;这意味着您不太可能溢出数组的最大大小。它也是完全有效的;编译器将转换。

标签: c segmentation-fault


【解决方案1】:

您应该检查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() 之前就耗尽了内存。这应该有助于解决这种可能性。

【讨论】:

  • 并且不要在 C 中从 malloc 转换返回值,它在某些时候咬你:-)
  • atoi() 返回一个int。将结果转换为long 不会导致任何问题(尽管它可能暗示N 应该被定义为int,或者您应该使用atol() 而不是atoi())。
猜你喜欢
  • 2015-01-06
  • 2016-03-24
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多