2017-10-06 75 views
0

在下面的代碼中,我想打印一個3×3矩陣,其中填充了o。但是我沒有得到想要的結果。如果使用C99編譯器運行程序,則第一個矩陣輸出就是我所期望的,第二個輸出就是我所得到的。 如果我不做初始化函數init()如果我在main()中進行初始化,它工作正常。但我不知道爲什麼數組沒有從init()正確返回,所以我可以使用它作爲display()函數中的一個參數。請幫助我無法從函數傳遞返回的字符數組作爲另一個函數中的參數

#include<stdio.h> 
    char * init(int a) 
    { 
     char tic[a][a]; 
     for(int i=0;i<=(a-1);i++) 
     { 
      for(int j=0;j<=(a-1);j++) 
      { 
       tic[i][j]='o'; 
      } 
     } 
     display(a,tic);//This is extra code just to show what I desire to print through this program 
     return (char *)tic; 
    } 


    int display(int a,char tic[a][a]) 
    {                   
     for(int i=0;i<=(a-1);i++) 
     { 
      for(int j=0;j<=(a-1);j++)     
      { 
       if(j==0) 
       { 
        printf("\n-------------\n|"); 
       } 
      printf(" %c |",tic[i][j]); 
      } 
     } 
      printf("\n-------------"); 

      return 0; 
    } 


    int main() 
    { 
     int a=3; 
     display(a,init(a)); 

     return 0; 
    } 
+0

@Sebivor我的問題是完全不同的 – Shubham

+0

似乎你想從'init'函數返回一個局部變量(數組)的地址。你不能那樣做。局部變量的範圍只在該函數內。閱讀「全局變量」和「malloc()」。 – babon

+1

這實際上不是關於範圍,而是存儲時間。範圍是標識符的可見性,並且在此代碼中沒有與該標識符相關的錯誤。但是,或者更明確地說,存儲期限是指存儲期限以外的對象... – Sebivor

回答

2

再問據C11/6.2.4p2

對象的壽命期間存儲是程序執行的部分保證爲它保留。存在一個對象,具有一個常量地址,並在其整個生命週期中保留其最後存儲的值。如果一個對象被引用到其生命週期之外,則行爲是不確定的。指針的值在其指向的對象(或剛剛過去)達到其生命週期結束時變得不確定。

在這種情況下,如果你能破譯整體,你就會明白什麼是錯的。你的代碼使用了一個指針,當函數返回時它變得不確定,結果你的代碼調用了未定義的行爲,並且可能會崩潰。

叫它範圍,如果必須,但該標準對範圍不同的定義,它是在我把我的信任標準。

我最大的擔心是你在閱讀任何合理的教育資源後如何得到這個問題......這似乎更像是一個猜測,就像你認爲你可以通過試驗和錯誤來學習C一樣。我想,你可能會很幸運,但是這種可能性很大程度上與你無關。

你應該看書,如果你還沒有;它可能會節省你很多漫長的夜晚勞動當你取消註釋未使用的變量 ...時消失的迴避性錯誤...

+0

只是有點懷疑:當我在init()中初始化數組時,值被存儲在由不同的數組元素指向的特定地址。 tic是本地的,所以在init()執行結束後變得未定義,那沒關係。但是這些地址的價值觀依然存在嗎?我傳遞了第一個元素的地址。所以,即使tic不存在,我從init返回的地址應該指向所需的值,不會嗎? – Shubham

+1

這些地址*的值可能會保留,但您訪問它們的唯一方法是通過引用其生命週期之外的對象(根據標準報價,導致未定義的行爲)。您的程序*可能還會*泄漏類似於心跳類似漏洞的相關形式的關鍵數據(這是令人驚訝的相關;這就是您應該具備的重要性)。其他功能*可能會改變你的數據*。我們不能說什麼*肯定會發生*,因爲行爲是未定義的。 – Sebivor

+0

如果我在main()函數中聲明數組(tic),然後將數組指針傳遞給初始化函數,那麼它工作正常。但是在這種情況下,當它到達main()之外時,它會超出數組的生命週期。那麼,爲什麼當我將數組指針作爲參數傳遞給main()函數時,它會起作用。爲什麼數組在一生中保持不變?另外,如果你能提出一個解釋這個特定概念的來源,那將是非常好的。非常感謝 – Shubham

1

在我看來,你想傳遞返回(字符指針),要求不同的參數(理想的是矩陣將字符指針的指針)的功能。所以,我建議您將char * init(int a){更改爲char ** init(int a),並將其返回return (char **)tic;

此外,你應該改變從功能顯示拍攝參數,int display(int a,char tic[a][a])int display(int a,char **tic)

1

自動對象(「局部變量」)走出去的範圍時,函數返回。這意味着在init()中聲明的tic[]不再存在於調用者(main main())中。從技術上講,這意味着你的程序調用未定義的行爲。您需要動態分配malloc()的tic數組。這裏有很好的答案#2如何做到這一點,所以不要:-)

相關問題