带代码片段的分段错误的起源

时间:2017-04-04 06:45:30

标签: c for-loop segmentation-fault gdb

我使用了原始代码片段,我用它进行了测试。原始表格如下:

#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));

因为,我已经纠正了这段代码片段,通过以下方式进行了正确的分配:

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));
 }

但我想知道上面第一个版块的分段错误的来源。

欢迎任何帮助,谢谢

1 个答案:

答案 0 :(得分:0)

  在第一个循环

之后,

new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(yourspecifictimeinmilliseconds); } catch (InterruptedException e) { e.printStackTrace(); } getActivity().runOnUiThread(new Runnable() { @Override public void run() { your3rdlayoutslayout.setVisibility(View.GONE); } }); } }).start(); 索引等于i

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

循环后

size_y-1

for (i = 0; i < size_y; i++) 的值不是i。有了这个,这一行

<size_y

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

循环之后的x[i][j] = ... 简单printf()将证明这一点。

顺便说一句,所有这些i都应该是int s。