關於printf造成指針*p亂碼的問題
阿新 • • 發佈:2017-07-01
討論 函數調用 r+ div ase lease 空間釋放 釋放 地址
關於printf()影響指針*p結果的有關討論,現摘取一篇網文。
int main() { int stu[M][N] = {NULL}; float* arr; float* MeanStuFun(int p[M][N]); int i,j; for(i=0;i<M;i++) { printf("please input the scores of NO.%d\n",i+1); for(j=0;j<N;j++) scanf("%d",&stu[i][j]); } arr=MeanStuFun(stu);
printf("\nevery student‘s mean score is:\n"); for(i=0;i<M;i++) printf("%8.2f",*(arr+i)); return 0; } float* MeanStuFun(int p[M][N]) { int i,j; float arr[M]={NULL}; float mean=0; for(i=0;i<M;i++) { for(j=0;j<N;j++) mean=mean+p[i][j]; arr[i]=1.0*mean/N; mean=0; } return arr; }
上面第一個printf()可以輸出標題,但第二個printf()輸出的值為亂碼。如果將第一個printf()移到arr=MeanStuFun(stu)前,則這種問題就得到解決。
這是什麽原因呢? 調用函數printf前先要將形參壓棧,這時候要計算*arr。所以,第一條printf語句已經把參數算出來並放到棧頂保存了。然後調用printf函數(函數調用需要用到棧建立訪問連和控制鏈,而原來的函數function執行完了,原本f是在棧頂的,所以,函數f的棧空間釋放。數組空間也被釋放),printf占用了棧,所以,把原來函數f的棧空間內容修改了。所以,第一條printf語句是可以得到結果的。後面因為arr空間的內容已經被修改,所以,之後的printf語句都得不到結果。
順便再解釋一下printf("%s\n",*arr);得到的為什麽是亂碼。
正如上面所說,先計算參數*arr的值保存棧頂。保存的值為arr的地址。然後調用printf函數,把棧頂空間內容修改了。雖然保存了地址,但是原來的內容已經修改了,所以得不到結果。
關於printf造成指針*p亂碼的問題