1. 程式人生 > >關於printf造成指針*p亂碼的問題

關於printf造成指針*p亂碼的問題

討論 函數調用 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亂碼的問題