2016-06-09 74 views
2

爲什麼當我這樣做時,我得到一段段錯誤?我只是給我的int數組的第一個值5?爲什麼tab [i] [j] =「value」段落

#include <stdlib.h> 
int main() 
{ 
int  **tab; 
int  i; 
int  j; 

i = 0; 
j = 0; 
tab = (int **)malloc(sizeof(int *) * 100); 
tab[i][j] = 5; 
return(0); 
} 

回答

0

tab[i]相同*(tab + i),但是你的數組中的值不會被初始化,所以要嘗試取消引用未初始化的指針,這將產生不確定的行爲。

2

因爲您尚未正確分配內存。實際上你所做的只是分配表格的。您尚未爲分配任何空間,但仍嘗試訪問它們,這會導致未定義的行爲。爲了解決這個問題,更換部件:

tab = (int **)malloc(sizeof(int *) * 100); 
tab[i][j] = 5; 

有:

tab = malloc(sizeof(int *) * 100); 
for (i = 0; i < 100; i++) 
    tab[i] = malloc(sizeof(int) * NUM) ; //where NUM is the size you want to allocate 
tab[i][j] = 5; 

在這個link看看,以瞭解指針內存分配如何指針的作品。


另外,參見why you should not cast the result of malloc

+0

對於二維數組,使用這種方法總是一個壞主意。 [見此](http://stackoverflow.com/a/32050859/584518)。此外,你提供的鏈接去一些愛好者業餘網站...我不會看它。 – Lundin

+1

@Lundin OP使用動態內存分配,所以我繼續他的方法。至於鏈接,它可能是業餘的,但我覺得它很容易理解和解釋。 – Marievi

+0

我沒有說過他不應該使用動態分配,我說他不應該分配一個分散在堆中的分段指針指針,因爲沒有理由。而他只是想要一個2D數組。鏈接可能很容易理解,但是**內容不正確,並且教授不好的練習**。再次,請[閱讀此](http://stackoverflow.com/questions/32050256/function-to-dynamically-allocate-matrix/32050859#32050859)。 – Lundin

1

你分配好自己的「矩陣」

然後,必須分配列,例如第一部分(行)

#define ROWS 100 
#define COLS 100 

tab = malloc(sizeof(int *) * ROWS); 
for (i = 0; i < ROWS; i++) 
    tab[i] = malloc(sizeof(int) * COLS) ; 
tab[i][j] = 5; 

,並釋放所有在年底以相反的順序

for (i = 0; i < ROWS; i++) 
    free(tab[i]); 
free(tab); 
+0

對於二維數組,使用這種方法總是一個壞主意。 [見此](http://stackoverflow.com/a/32050859/584518)。 – Lundin

+0

@Lundin當然,我+1,但OP沒有說它想要一個2D矩陣,我猜對了。我基於我對指針分配指針的回答。我的意思是:每行可變列寬的「矩陣」。 ;) – LPs

+0

這裏的重要部分是我們必須阻止人們將這個指針指向指針方法。大多數新手都會濫用它,因爲他們真的只需要一個二維數組,這完全是無稽之談。 – Lundin

2

內存可能與此分配。檢查malloc的返回,當不再需要時,釋放內存。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int row = 23; 
    int col = 100; 
    int i = 0; 
    int j = 0; 
    int (*tab)[col] = NULL; 
    if (((tab) = malloc(sizeof(*tab) * row)) == NULL) { 
     printf ("malloc failed\n"); 
     return 1; 
    } 
    tab[i][j] = 5; 
    free (tab); 
    return 0; 
} 
相關問題