2017-04-04 18 views
0

我使用了一個原始代碼片段,並對其進行了測試。原來的形式下面以下幾點:帶有代碼段的分段錯誤的起源

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

但我想知道上面的代碼段的第一個版本的分段錯誤的起源。

歡迎任何幫助,感謝

+4

'x [i] [j] = malloc(size_z * sizeof(*** x));'問這個:那條線上'i'的值是多少? – kaylum

+0

,'i'等於'size_y-1',不是嗎? – youpilat13

+0

當'i LPs

回答

0

i指數是第一個循環

無後等於size_y-1,事實並非如此。如果是循環還沒有結束。

環路

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

後的i值不<size_y。與此,此行

x[i][j] = ... 

訪問無效內存,調用未定義的行爲。從此以後可能會發生任何事情。

一個簡單的printf()i後循環會證明這一點。


順便說一句,所有這些int S的關係是size_t秒。