[問題] 動態配置下二維陣列參數傳遞

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

Links booklink

Contact Us: admin [ a t ] ucptt.com