繁体   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