為了讓c語言函式返回乙個二維陣列,有些人這樣定義函式:
int **foo(int rows, int columns)
然後在函式中費勁心機拼出來乙個這樣的malloc語句:
int (*result)[columns] = (int (*)[columns])malloc(rows * columns * sizeof(int));
在函式內讀寫這個陣列發現很正常,等把陣列返回給呼叫函式後,再讀寫這個陣列就crash掉了。
原因其實很簡單,函式返回值型別是int **foo,而實際返回值型別是int (*bar)[columns],它們的區別就是foo[1] - foo[0] = sizeof(int *),而bar[1] - bar[0] = sizeof(int [columns])。把bar賦值給foo以後,訪問foo[1][0]會訪問到啥呢?首先要看foo[1]是個啥,foo[1] = *(foo + 1),那個1雖然看起來是1,但是實際加到foo上的大小實際上是foo指向元素的大小,如果說sizeof(int) = sizeof(int *) = 4的話,也就是foo值增加4,然後對這個位址取值,放到bar中取到了啥呢,實際上取出來的是bar[0][1],所以說,實際上foo[1] = bar[0][1],然而bar[0][1]並不是乙個指標或者陣列,所以讀foo[1][0]就會crash掉。
正確的做法是這樣的:
int **result = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < columns; i++)
當然你也可以修改函式原型返回型別,但是那樣的話函式看起來就會比較費解一些。當然了,你也可以定義乙個結構體,結構體裡面放乙個陣列,但是這樣做的缺陷就是大小需要固定,沒辦法根據輸入動態產生乙個指定大小的結構體。 返回二維陣列
二維陣列的返回 確切的說是返回二維陣列的指標,二維陣列和一位陣列稍微有些不同,鑑於一維陣列過於簡單,博主在此只講返回二維陣列的兩種方法。一如既往的少廢話,直接上刑,不,上 include int array void return a 返回二維陣列的第一行的首位址 int main void pri...
c 返回二維陣列 C的指標(三)指標和二維陣列
對於二維陣列array 4 5 array應理解為是包含四個元素的陣列,每個元素是乙個一維陣列,它們有五個元素。例 int mat 3 4 陣列含義 考慮到陣列名代表陣列第乙個元素的位址 mat mat 0 mat 0 mat 0 0 matmat 0 1指向陣列mat 0 的第二個元素,是mat ...
C 二維陣列
c 二維陣列 微學苑 具有兩個下標的陣列稱為二維陣列。有些資料要依賴於兩個因素才能惟一地確定,例如有3個學生,每個學生有4門課的成績,顯然,成績資料是乙個二維表,如書中表5.1所示。表5.1 學生成績資料表 學生序號 課程1課程2 課程3課程4 課程5學生1 8578 9996 88學生2 7689...