我使用了原始代码片段,我用它进行了测试。原始表格如下:
#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));
}
但我想知道上面第一个版块的分段错误的来源。
欢迎任何帮助,谢谢
答案 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。