[英]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
而不是%s
的char
,后者用於以空字符結尾的字符數組。
但要注意:
char * myfn2() {
buf[10]="Hello";
return buf;
}
通常不會導致錯誤,但會是簡單的未定義行為,因為函數會返回一個自動變量的地址,該變量在您可以使用之前可能會被銷毀。
我覺得你還是要學C...
在C語言中,數組名是一個pointer
,以它的第一個元素,這樣你就返回一個pointer
到一個char
,而不是一個char
,這就是你宣布myfn2()
返回。
問題不在於返回char *
。 那完全沒問題。
問題是取消引用指向不再有效的位置的指針。 printf("%d\\n", myfn1());
printf值是int
。 同樣,打印指針的值是可以的:
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.