2016-09-20 43 views
2

我在C代碼中發現了一個段錯誤,並且在搜索後找不到一個好的解釋或解決方案。導致段錯誤的int指針的動態數組

這第一個代碼給我打印0

#include <stdlib.h> 
#include <stdio.h> 
int main() { 
    int **defs = malloc(16 * sizeof *defs); 
    int i; 
    for (i = 0; i < 16; i++) { 
     printf("%d\n", i); 
     *defs[i] = i; 
    } 
    free(defs); 
    return 0; 
} 

這第二個代碼工作正常,後段故障。

#include <stdlib.h> 
#include <stdio.h> 
int main() { 
    int *defs = malloc(16 * sizeof defs); 
    int i; 
    for (i = 0; i < 16; i++) { 
     printf("%d\n", i); 
     defs[i] = i; 
    } 
    free(defs); 
    return 0; 
} 

這些只是例子,不是我的實際代碼。我也試過做指針算術,但結果相同。 有人能解釋一下嗎?謝謝。

+2

'* defs [i]'。在這之前,你需要初始化'defs [i]'指向某處。 –

+1

指針必須指向某個地方纔能被取消引用 –

回答

4

在第一個代碼中,您尚未分配每個int*內存塊。 因此,在將值分配給defs[i]之前,您必須使用int*類型的內存填充它。

defs[i] = (int*)malloc(sizeof(int) * number_of_elements); 

然後defs[i][some_index] = value

+0

在我的情況下,在循環中添加'def [i] = malloc(sizeof(int));'。謝謝。 – Munir

+0

你的'def [i]'只能存儲1個元素....但你可以存儲多於1個元素。但是你應該總是避免....可能發生分段錯誤。 –

+0

@Munir ...恩。爲什麼你要在堆上分配單個的「int」呢?爲什麼你甚至要創建一個指針數組而不是'int'數組,而你爲什麼使用'malloc'而不是'new'? –