我遇到了一些不可预测的行为。如果是这样的话:
int main()
{
char *str = charfun();
printf("%s",str); // This is printing garbage values
printf("%c%c%c%c",str[0],str[1],str[2],str[3]); /* if I am printing
like this it is printing the result "Helo" why is it so ?
and str[4] is '\0' (checked its ASCII value)*/
return 0;
}
char* charfun()
{
char a[10]="Helo";
return a;
}
编辑 -
我关心的不是我要归还的本地地址。我知道这会让我陷入困境。但我想了解两个printf遵循的打印方法,并给出不同的结果。
答案 0 :(得分:4)
这是因为a
中的charfun()
是本地数组。当charfun()
返回时,a
的地址被分配给str
,但它指向的数组已经失效。
答案 1 :(得分:1)
这里的问题是,当你创建局部变量时,它会在堆栈上分配,因此一旦函数完成执行就不可用。最好的方法是使用malloc()来保留非本地内存。字符串a
是函数的本地字符,你不能返回它的指针,它是Undefined Behavior
所以它必须使用malloc分配在堆而不是堆栈上:
char *charfun(){
char *a = malloc(sizeof(char)*10);
strcpy(a,"Helo");
return a;
}