0

在字符串的情况下,我遇到了一些不可预测的行为。这里是:

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

4

2 回答 2

5

这是因为aincharfun()是一个本地数组。charfun()返回时,的a地址被分配给str,但它指向的数组已经失效。

于 2012-09-21T00:12:27.890 回答
2

这里的问题是,当您创建局部变量时,它被分配在堆栈上,因此一旦函数完成执行就无法使用。最好的方法是使用 malloc() 来保留非本地内存。该字符串a是函数的本地字符串,您不能返回指向它的指针,Undefined Behavior因此必须使用 malloc 在堆而不是堆栈上分配它:

char *charfun(){
    char *a = malloc(sizeof(char)*10);
    strcpy(a,"Helo");
    return a;
}
于 2012-09-21T00:15:15.297 回答