打印期间出现意外的字符串行为

时间:2012-09-21 00:10:40

标签: c

我遇到了一些不可预测的行为。如果是这样的话:

 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遵循的打印方法,并给出不同的结果。

2 个答案:

答案 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;
}