2015-06-21 52 views
-3

如何返回一個局部變量是int的作品,但字符不? 代碼片斷如何在C中返回一個char和int變量?

int myfn1() { 
int i=10; 
return i; 
} 

char myfn2() { 
char buf[10]="Hello"; 
return buf; 
} 

int main(){ 
printf("%d\n", myfn1()); 
printf("%s\n", myfn2()); 
} 

輸出:

10 
Segmentation fault 

我是新來的C語言編程,我知道,局部變量的作用域是函數內myfn2崩潰是有道理的我,但怎麼做myfn1作品?

+0

'buf'似乎既不是局部變量也不是'char'。有沒有可能缺少一些? – Ryan

+1

你沒有返回字符。 'buf'不是'char'。 – juanchopanza

+3

我想你應該停下來研究一下關於指針和它們與字符串/數組的關係(注意我沒有說出字符)。 – Pynchia

回答

1

這段代碼

char myfn2() { 
buf[10]="Hello"; 
return buf; 
} 

是什麼不應該做一個總結!

char myfn2()承諾返回char並且您將返回char *return buf[0];return *buf;將擺脫錯誤,並且將是正確的,因爲您將返回一個整數值 - 但是您顯示char%c而不是%s,後者用於空終止的字符數組。

但要注意:

char * myfn2() { 
buf[10]="Hello"; 
return buf; 
} 

通常不會導致錯誤,但將是純未定義行爲,因爲函數將返回一個被毀滅之前,你可以用它的自動變量的地址

我覺得你還是要學習C ...

1

在C中,數組的名字是一個pointer它的第一個元素,這樣你就返回pointerchar而不是char,這是你宣佈myfn2()返回。

0

問題是返回char *的返回。這很好。

問題是將該指針取消引用到不再有效的位置。 printf("%d\n", myfn1()); printf int。打印指針的值,像明智的,是OK:

int main(void) { 
    printf("%p\n", (void*) myfn2()); // OK - pointer's value is printed 
    printf("%s\n", myfn2());   // Bad - code attempts sting access to invalid pointer. 
} 
0

你是錯的兩種功能。正如您所知,局部變量作用域在函數中受到限制。 這裏你傳遞的是局部變量bu按值傳遞,編譯器通過函數結束來殺死變量。所以你試圖訪問一個死亡的變量數據,輸出是不可預測的。

0

myfn1如何工作?

它的工作原理是因爲您正在返回存儲在變量「i」中的值而不是「i」的地址。

myfn2返回不再有效的數組'buf'的地址。

相關問題