2016-09-25 71 views
1

我覺得像兩個代碼段都在做同樣的事情,但一個賽格故障ç賽格故障分配通過功能的陣列時和打印陣列

代碼1:本印刷精美

int main(){ 
    int n = 3; 
    int i; 
    int *arr = (int *) malloc(sizeof(int) * n); 
    int * can_arr; 

    arr[0] = 3; 
    arr[1] = 2; 
    arr[2] = 1; 
    arr[3] = 2; 

    can_arr = arr; 
    for(i = 0; i <= n; i++) 
    printf("%d ", can_arr[i]); 
    return 0; 
} 

代碼2:我在打印時出現seg故障

void get_arr(int n, int *arr, int *can_arr){ 
    can_arr = arr; 
} 
int main(){ 
    int n = 3; 
    int i; 
    int *arr = (int *) malloc(sizeof(int) * n); 
    int * can_arr; 

    arr[0] = 3; 
    arr[1] = 2; 
    arr[2] = 1; 
    arr[3] = 2; 

get_arr(n, arr, can_arr); 
for(i = 0; i <= n; i++) 
    printf("%d ", can_arr[i]); 
return 0; 
} 

爲什麼?兩個都在做can_arr = arr?我正在做我需要這個數組賦值的代碼中的其他東西。我在這裏簡化了它。那麼爲什麼它會出現問題?

+0

「代碼1:此打印精」 - 嗯我不敢苟同。 'arr [3] = ...'全部由它自己調用*未定義的行爲。你的數組只有** 3 **元素,每個malloc的大小。因此僅從「0..2」索引。因此,你的代碼調用*未定義的行爲*,超出這一點的任何東西都是毫無意義的分析。 – WhozCraig

回答

2

問題是can_arr from main按值傳遞給函數get_arr。這意味着行:

can_arr = arr; 

在該函數具有局部變量can_arr被分配一個值的效果。但是這個變量對於函數是本地的。所以它不會影響main中的can_arr變量。因此,當您嘗試在循環中從can_arr讀取時,can_arr仍將未初始化。

2

陣列arr指針在兩個實施例已被分配足夠的內存3層的元件,與

int n = 3; 
int *arr = (int *) malloc(sizeof(int) * n); 
// ... 
arr[3] = 2; 

但是你索引一個第四元件arr[3]。所以無論出現工作,是靠運氣。

而且循環

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

不正確,應該是

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