为什么这些程序(仅在一个printf语句中有所不同)具有不同的输出?

use*_*261 1 c string

计划#1:

#include<stdio.h>
#include<stdlib.h>
char *getString()
{
   char str[] = "GfG";
   printf("%s \n", str); 
   return str;
}    
int main()
{
    printf("%s", getString()); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

GfG
GfG
Run Code Online (Sandbox Code Playgroud)

计划#2:

#include<stdio.h>
#include<stdlib.h>
char *getString()
{
    char str[] = "GfG";
    return str;
}    
int main()
{
    printf("%s", getString()); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

(垃圾值)

请解释为什么因为只有一个printf语句输出不同.具体描述是什么?

oua*_*uah 10

因为两个程序都显示未定义的行为.

getString函数返回时,str数组对象被销毁并在其生命周期后尝试访问它是未定义的行为.

您可以使用字符串文字修复程序,因为字符串文字具有静态存储持续时间,其生命周期是程序的整个持续时间:

char *getString(void)
{
    char *str = "GfG";
    return str;
} 
Run Code Online (Sandbox Code Playgroud)

  • `const char*`对于`return`和`str`都是肯定的.可能某些编译器可能不会强制执行"不允许写入常量字符串"规则. (3认同)