簡體   English   中英

返回 char 與 int 變量如何在 C 中工作?

[英]how does returning a char vs int variables works in C?

返回 int 的局部變量如何但 char 不起作用? 代碼片段

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 是如何工作的?

這段代碼

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

是不應該做的總結!

char myfn2()承諾返回一個char而你正在返回一個char * return buf[0]; return *buf; 將消除錯誤並且是正確的,因為您將返回一個整數值 - 但您顯示一個帶有%c而不是%schar ,后者用於以空字符結尾的字符數組。

但要注意:

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

通常不會導致錯誤,但會是簡單的未定義行為,因為函數會返回一個自動變量的地址,該變量在您可以使用之前可能會被銷毀。

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

在C語言中,數組名是一個pointer ,以它的第一個元素,這樣你就返回一個pointer到一個char ,而不是一個char ,這就是你宣布myfn2()返回。

問題在於返回char * 那完全沒問題。

問題是取消引用指向不再有效的位置的指針。 printf("%d\\n", myfn1()); printfint 同樣,打印指針的是可以的:

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.
}

printf("%s\\n", myfn2());

%s ==> 從地址開始讀取,並在到達 '/0' 時結束,但是您正在傳遞一個具有 8 位數據的字符,它可以容納的最大值為 255。

該輸入字符值將被視為地址,並且該地址范圍非常小(通常為 32 位/64 位地址),因此它不會為輸入找到任何物理內存。 所以我們遇到了分段錯誤。

myfn1 是如何工作的?

它有效是因為您返回的是存儲在變量“i”中的值,而不是“i”的地址。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM