【问题标题】:Origin of a segmentation fault with a code snippet带有代码片段的分段错误的起源
【发布时间】:2017-08-29 05:35:28
【问题描述】:

我使用了我进行测试的原始代码 sn-p。原始形式如下:

#include <stdio.h>
#include <stdlib.h>

int main() {

 int i,j;
 int  size_x = 100;
 int  size_y = 100;
 int  size_z = 100;

 double ***x;

 x = malloc(size_y * sizeof(*x));
 for (i = 0; i < size_y; i++)
    x[i] = malloc(size_x * sizeof(**x));

 for (j = 0; j < size_x; j++)
    x[i][j] = malloc(size_z * sizeof(***x));

 return 0;

}

在执行时,我得到一个Segmentation error,但我不知道这个错误可能来自哪里。

有人能看出这个错误的原因吗?第一个循环后i索引等于size_y-1,第二个循环似乎是正确的......

gdb 给与backtrace

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005b6 in main () at main_Syntax_Alloc_SEGFAULT.c:17
17      x[i][j] = malloc(size_z * sizeof(***x));

因为,我已经纠正了这个代码 sn-p 有一个正确的分配,通过这样做:

double ***x;
x = malloc(size_y * sizeof(*x));
for (i = 0; i < size_y; i++)
 {
  x[i] = malloc(size_x * sizeof(**x));
  for (j = 0; j < size_x; j++)
     x[i][j] = malloc(size_z * sizeof(***x));
 }

但我想知道上面第一个版本的sn-p分段错误的根源。

欢迎任何帮助,谢谢

【问题讨论】:

  • x[i][j] = malloc(size_z * sizeof(***x)); 问这个问题:i 那行的值是多少?
  • 在那一行,i 等于size_y-1,不是吗?
  • 以前的for 结束于i &lt; size_yfalse..... 所以......i=???
  • 好的,i=100 在第一个循环结束时
  • 别做三星级程序员....wiki.c2.com/?ThreeStarProgrammer

标签: c for-loop segmentation-fault gdb


【解决方案1】:

i 索引在第一个循环之后等于size_y-1

不,不是。如果是循环还没有结束。

循环之后

for (i = 0; i < size_y; i++)

i 的值不是&lt;size_y。有了这个,这条线

x[i][j] =  ...

访问无效内存,调用未定义的行为。从那时起,任何事情都可能发生。

循环之后的i 中的一个简单printf() 可以证明这一点。


顺便说一句,所有ints 应该是size_ts。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2013-04-12
    • 2023-03-26
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多