在C语言中,返回char和int变量是如何工作的?

在C语言中,返回char和int变量是如何工作的?,c,char,int,return,C,Char,Int,Return,返回一个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崩溃对我来说很有

返回一个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*
返回buf[0]
返回*buf
将消除错误,并且将是正确的,因为您将返回一个整数值-但是您将显示一个带有
%c
字符,而不是
%s
,后者用于以null结尾的字符数组

但要注意:

char * myfn2() {
buf[10]="Hello";
return buf;
}
通常不会导致错误,但显然是未定义的行为,因为函数将返回一个自动变量的地址,该地址可能在您使用它之前被销毁


我认为你仍然需要学习C…

在C中,数组的名称是指向其第一个元素的
指针,因此你将
指针
返回到
字符
,而不是
字符
,这是你声明的
myfn2()
返回的。

问题是不返回
字符*
。那很好

问题是取消引用指向不再有效位置的指针<代码>printf(“%d\n”,myfn1())
printf该值是
int
。打印指针的值(如wise)是正常的:

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”的地址。

buf
既不是局部变量,也不是字符。是否缺少一些位?您没有返回字符
buf
不是
char
。我认为您应该停下来,进一步研究指针及其与字符串/数组的关系(注意,我没有说chars)。
myFn1
返回
I
的值。所以它起作用了。(
i
正在底层程序集中的返回寄存器中返回。)您的
myfn2
有一个
char[]
用于
buf
(不是
char
!),并且
return buf
返回临时的
buf
地址(在
myfn2
的堆栈上)。因此,
myfn2
返回后,
buf
的地址不再有效。即使正确声明了
myfn2
返回值,这也是正确的。请注意编译器错误/警告,它应该指出了
myfn2
的问题。(如果不是,则将错误级别调高)。