在C语言中,返回char和int变量是如何工作的?
返回一个int的局部变量如何工作而char不工作? 代码片段在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 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
的问题。(如果不是,则将错误级别调高)。