[英]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.