顯示廣告
隱藏 ✕
看板 Programming
作者 SmallBee (蜜蜂貓)
標題 Re: 想要請教關於矩陣的問題
時間 2014年01月18日 Sat. PM 03:14:11


※ 引述《s9331619》之銘言:
: 已下這是我的問題。
: 首先我希望的程式他可以把我的矩陣空下來可以補數字進去。大概很像A[0][0]=1 A[0][1]=2 A[0][2]=3 想要利用程式把呈現A[0][0]=3 A[0][1]=1 A[0][2]=2。可是我的程式他都會顯示A[0][0]=-33686019 A[0][1]=1 A[0][2]=2。所以想要請教妳們各位高手是否可以幫我看一下我的程是哪裡出錯了 感恩
:
	
for(int i=0;i<1;i++)

:
	
{

:
	
	
for(int j=0;j<3;j++)

:
	
	
{

:
	
	
	

:
	
	
	
A[i*3+j]=i*3+j;

:
	
	
	
B[i*3+j]=A[i*3+(j-1)]+1;

:
	
	
	
printf("%d\t",B[i*3+j]);

:
	
	
}

:
	
}

這段迴圈拆解之後會變成
A[0]=0;
B[0]=A[-1]+1; //=?+1
A[1]=1;
B[1]=A[0]+1; //=0+1=1
A[2]=2;
B[2]=A[1]+1; //=1+1=2

A[-1]是個不合法的位置,當然會出現預期以外的值

==============================
malloc會要求系統從連續的記憶體空間中,註冊一段未被使用的部分
當你malloc(sizeof(int)*3)就是跟系統要了三個int長度的空間
而之前的A[-1],A[-2]...或是之後的A[3],A[4],A[5]則可能未或已被註冊使用
這些區域仍然是可以被讀取的(除非你去讀取被系統設為禁止讀取的位址, ex: int i=*(int*)0)
也可以被寫入,只是那有可能會變成一場災難(緩衝區溢位錯誤)
而且是很難被發現跟處理的災難

因此現在高階程式語言很多都會透過邊界檢查之類的機制防止這種錯誤

總之,如果你想讀入A[2]的值,你必須要用A[3-1]而不是A[-1],這兩個位址不一樣

--
※ 作者: SmallBee 時間: 2014-01-18 15:14:11
※ 看板: Programming 文章推薦值: 2 目前人氣: 0 累積人氣: 576 
( ̄︶ ̄)b gogomako, hsieang 說讚!
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇