[爆卦]malloc一維陣列是什麼?優點缺點精華區懶人包

為什麼這篇malloc一維陣列鄉民發文收入到精華區:因為在malloc一維陣列這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者bben900911 (Ben)看板C_and_CPP標題[問題] 動態配置下二維陣列參數傳遞時...


開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC

額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

None
問題(Question):

想嘗試練習指標與陣列的相關使用

compile時就宣告好大小的二維陣列依照置底方式傳遞應該沒問題

在動態配置的陣列傳遞時,想要採用轉成一維陣列卻無法得到正確結果
餵入的資料(Input):
row=5
column=5

預期的正確結果(Expected Output):
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1


錯誤結果(Wrong Output):

5*5的完全不是1的數字

程式碼(Code):(請善用置底文網頁, 記得排版)
#include<stdio.h>


int c_array(int *a,int row,int column,int i,int j)
{
printf("%d ",*( a + i*column +j ) );//使用pointer來控制矩陣
}


int main(void)
{
int **ptr=NULL;
int row,column;
int i,j;

while(1)
{
printf("row=\n");
scanf("%d",&row);
printf("column=\n");
scanf("%d",&column);

if(row==0 && column==0) break;



ptr=(int**)malloc(sizeof(int*)*row);
//生成一維指標陣列
for(i=0;i<row;i++)
{
ptr[i]=(int*)malloc(sizeof(int)*column);
}//二維

for(i=0;i<row;i++)
{
for(j=0;j<column;j++)
{
ptr[i][j]=1;
}
}//將矩陣付值:1

for(i=0;i<row;i++)
{
for(j=0;j<column;j++)
{
//printf("%d",ptr[i][j]);//測試用
c_array((int*)ptr,row,column,i,j);//使用另外函數來print
}

printf("\n");//換行
}

for(i=0;i<row;i++) free(ptr[i]);
free(ptr);//釋放記憶體

}

return 0;



}


補充說明(Supplement):



--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.182.246
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1422963297.A.B4F.html
bben900911: http://ideone.com/JQjKaJ 舒服閱讀版 02/03 19:40
PkmX: (int*) ptr這邊是錯的吧... 02/03 19:52
PkmX: 你把存放每個一維陣列指標的陣列的位置傳過去了... 02/03 19:53
bben900911: 那大概怎麼傳呢@@? 抱歉pointer就是在練習中QQ 02/03 19:57
BombCat: http://ideone.com/Wv0xti 02/03 20:04
bben900911: 能夠討教箇中原理嗎?(跪 02/03 20:08
wenyonba: 這不畫個圖,老實說用文字講起來還滿難講的 XD 02/03 20:12
bben900911: 我先說我的理解:我原本的作法 02/03 20:14
bben900911: 是把二維矩陣平面化成一維:p11 p12 p13 p21 p22 p23.. 02/03 20:16
bben900911: 所以我在函數內的處理上以為傳進的Pointer就可以進行 02/03 20:17
bben900911: 操作成數值(ex: p23=*(&p11+3*1+3) 02/03 20:18
bben900911: 但我是用pointer動態配置二維矩陣的 02/03 20:19
bben900911: 也就是函數看到的就真的只是一個一維矩陣,上面一堆P 02/03 20:20
bben900911: 一堆pointer,所以反而應該用雙重矩陣去解讀,再拆開 02/03 20:21
bben900911: 雙重指標* 02/03 20:21
EdisonX: *( a + i*column +j ) 一維陣列表示二維陣列,不同等動態 02/03 20:26
EdisonX: 二維取索引,最大的差別是可能不連續,碎片化。 02/03 20:26
EdisonX: 當然還有額外指標空間,沒畫圖真不好說 02/03 20:27
bben900911: 我後來的理解大致上是對的嗎? 還有 02/03 20:28
bben900911: 依照炸彈貓大修改後,傳入那邊 無論使用 02/03 20:29
bben900911: ptr、(int*)ptr、(int**)ptr、(int***)ptr都會是正解 02/03 20:30
bben900911: why? 02/03 20:30
wenyonba: 樓上大哥講出重點了,可以再想想 02/03 20:32
wenyonba: 如果找一個你身邊的人會的,畫個圖,你應該三秒就懂 XD 02/03 20:33
bben900911: 所以我推文的後來想法還是錯的嗎QQ 02/03 20:34
bben900911: 就:我把內涵一堆指標的一維矩陣丟進函數 02/03 20:35
bben900911: 對這東西作一維處理,不管怎樣都(ry 02/03 20:35
wenyonba: www.programmer-club.com.tw/ShowSameTitleN/c/45669.ht 02/03 20:38
wenyonba: ml 有點長,網址分兩段打 02/03 20:39
wenyonba: 回文裡有個圖,你看看也許有幫 02/03 20:39
wenyonba: 助 02/03 20:39
BombCat: 我覺得你的後來想法應該是對的 02/03 20:57
BombCat: ptr、(int*)ptr、(int**)ptr、(int***)ptr都會是正解是因 02/03 20:58
BombCat: 為C語言的type checking比較寬鬆,JAVA、Pascal就沒辦法 02/03 21:00
BombCat: 讓你這樣compile過 02/03 21:00
BombCat: 對c_array而言,a的tpye就是int **不管它的值怎麼取得的 02/03 21:07
bben900911: 也就是我不管在那一行怎麼cast,c_array都會用 02/03 21:10
bben900911: 雙重指標接所以OK。然而其他語言的compiler再檢查 02/03 21:11
bben900911: 雙邊type時比較嚴格,所以應該是只有(int **) ptr 過? 02/03 21:12
BombCat: 我覺得是這樣啦 :) 02/03 21:13
bben900911: 感謝樓上各位大大,感激不盡 02/03 21:14
PkmX: 題外話:炸彈貓那個*(*(a+i)+j)其實就是a[i][j] XD 02/03 21:17

你可能也想看看

搜尋相關網站