2016-07-08 78 views
-2

我對C的非常基礎知識有疑問。有人可以澄清這段代碼嗎?

  • 我寫了下面的代碼。在這裏add()函數,我沒有返回任何東西,所以我期望輸出將是一些垃圾值或某事,但它不會發生這樣的事情。任何人都可以向我解釋爲什麼會發生這種情況?如果我在代碼中寫錯了,請原諒我。
  • 據我的理解,我認爲變量add1的內存將來自堆棧,因此一旦完成add(),所有分配的內存將被釋放,因此將顯示一些垃圾值。
  • 我明確的疑問是沒有返回任何東西,它如何打印正確的值?

代碼示例:

main() { 
    int x = 4, sum; 
    int n; 

    printf(" enter a number \n"); 
    scanf("%d", &n); 

    sum = add(x, n); 

    printf(" total sum = %d\n", sum); 
} 


add(int x, int n) { 
    int add1 = 0; 

    add1 = x + n; 

    //return(add1); 
} 
+5

這是未定義的行爲。嘗試並理解到底發生了什麼並不是很有成效。無論你看到什麼行爲都是不可預測的 - 它可能會根據操作系統,編譯器,程序中的其他(甚至不相關的)代碼等而改變。 – kaylum

+2

使用什麼編譯器? gcc無法編譯此代碼 錯誤:ISO C++禁止使用無類型的'add'聲明[-fpermissive] – Evgeniy

+5

@Evgeniy:指出不同語言的作用是無用的。 C不是C++不是C. – Olaf

回答

0

這是不確定的行爲。

當您不指定函數返回的內容時,它將默認爲int。那麼當你沒有返回聲明時,它將不確定會發生什麼。所以原則上可能發生任何事情。

對於gcc,它會在很多系統上返回一些「隨機」值。在你的情況下,恰好是總和。簡單地通過「運氣」。

在編譯過程中始終打開警告,例如gcc -Wall並始終將警告視爲錯誤。

你的代碼應該是這個樣子:

#include <stdio.h> 

int add(int x,int n);  // Corrected 

int main(void) // Corrected 
{ 
    int x=4,sum; 

    int n; 

    printf(" enter a number \n"); 
    scanf("%d",&n); 

    sum = add(x,n); 

    printf(" total sum = %d\n",sum); 

    return 0;  // Corrected 
} 


int add(int x,int n)  // Corrected 
{ 

    int add1=0; 

    add1 = x+n; 

    return add1;  // Removed the // to uncomment and removed unnecessary() 
} 
+2

您嘗試定義** undefined **行爲的行爲方式。純粹推測是否有一個「隨機值」返回或鼻子守護進程出現。標準兼容編譯器**還有其他一些問題需要**警告。 – Olaf

+0

是的兄弟,烏爾編輯的代碼將正常工作,我明白了,但我的問題即使你不提交任何return語句,它是否會隨機返回?理想情況下,它不應該返回任何正確的東西,Stack也會爲add1釋放內存,因此價值將會丟失。我很困惑。你可以更清楚地解釋一下嗎? –

+1

@ t.purnaChander - 在大多數系統中,像這樣的簡單函數將通過將值放入其中一個CPU寄存器來返回值。這是系統特定的並記錄在ABI中。 'main'中的代碼只讀取該寄存器並將其作爲返回值。函數是否實際寫入寄存器並不重要。 – 4386427

0

如前所述,這是不確定的行爲,你不應該依賴於它。

但是,背後有什麼邏輯。按照慣例,函數的返回值存儲在x86的eax寄存器或x86_64的rax寄存器中。只是碰巧你的編譯器也使用寄存器eaxrax來存儲計算值。此外,由於未指定返回類型add(),因此它被隱式定義爲int

相關問題