爲什麼當我這樣做時,我得到一段段錯誤?我只是給我的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);
}
爲什麼當我這樣做時,我得到一段段錯誤?我只是給我的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);
}
tab[i]
相同*(tab + i)
,但是你的數組中的值不會被初始化,所以要嘗試取消引用未初始化的指針,這將產生不確定的行爲。
因爲您尚未正確分配內存。實際上你所做的只是分配表格的行。您尚未爲列分配任何空間,但仍嘗試訪問它們,這會導致未定義的行爲。爲了解決這個問題,更換部件:
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看看,以瞭解指針內存分配如何指針的作品。
你分配好自己的「矩陣」
然後,必須分配列,例如第一部分(行)
#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);
內存可能與此分配。檢查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;
}
對於二維數組,使用這種方法總是一個壞主意。 [見此](http://stackoverflow.com/a/32050859/584518)。此外,你提供的鏈接去一些愛好者業餘網站...我不會看它。 – Lundin
@Lundin OP使用動態內存分配,所以我繼續他的方法。至於鏈接,它可能是業餘的,但我覺得它很容易理解和解釋。 – Marievi
我沒有說過他不應該使用動態分配,我說他不應該分配一個分散在堆中的分段指針指針,因爲沒有理由。而他只是想要一個2D數組。鏈接可能很容易理解,但是**內容不正確,並且教授不好的練習**。再次,請[閱讀此](http://stackoverflow.com/questions/32050256/function-to-dynamically-allocate-matrix/32050859#32050859)。 – Lundin