為了讓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 < rows; i++)
當然你也可以修改函式原型返回型別,但是那樣的話函式看起來就會比較費解一些。當然了,你也可以定義乙個結構體,結構體裡面放乙個陣列,但是這樣做的缺陷就是大小需要固定,沒辦法根據輸入動態產生乙個指定大小的結構體。
之前還寫過一篇相關的部落格,可以參考一下:
c語言,c 函式返回乙個陣列,二維陣列
與其他高階語言相比,c語言,c 最大的不方便之處就是 函式只能返回乙個數值。若要返回乙個陣列,必須用到指標以及動態分配記憶體。這是乙個坎,就如學結他時的大橫按一樣,不少人在這個坎上望而卻步。我前幾年一直看不懂,最近重溫c 與c 的動態記憶體,發現忽然明白會用了。可能經過這幾年大量的程式設計,越來越具...
如何讓乙個函式返回多個值(C )
有兩種方法 1.使用指標變數宣告函式 或者使用陣列變數 2.使用傳出引數 第二種方法 我用例子說明。首先聲名乙個函式,定義如下 public bool checkuser string username,out string password,out int state else return fa...
如何new乙個二維陣列
定義二維陣列char array x y 1.只定義個一維的就可以了 char array array new char x y 訪問的時候 array i y j 表示array i j 2.定義乙個二維陣列 char array1 array1 new char x for i 0 iarray...