为什么返回语句在C中出现错误?

为什么返回语句在C中出现错误?,c,arrays,function,stack,C,Arrays,Function,Stack,我已经给出了基于给定链接的两个代码的示例。假设getstring()是一个函数 及 因为两者都具有自动存储持续时间,并且两个变量都存储在堆栈段上 那么,为什么返回str适用于第一个而不适用于第二个?两个版本的str都有自动存储持续时间。但它们的类型不同,这就造成了所有的不同 char*str-是一个指针。它指向一个字符串文本。文本的存储持续时间是静态的。返回str,将返回文本的地址(返回str的内容),一切正常 char str[]-是一个本地数组。它是从文本初始化的。但是整个缓冲区的持续时

我已经给出了基于给定链接的两个代码的示例。假设getstring()是一个函数



因为两者都具有自动存储持续时间,并且两个变量都存储在堆栈段上


那么,为什么返回str适用于第一个而不适用于第二个

两个版本的
str
都有自动存储持续时间。但它们的类型不同,这就造成了所有的不同

char*str
-是一个指针。它指向一个字符串文本。文本的存储持续时间是静态的。返回
str
,将返回文本的地址(返回
str
的内容),一切正常


char str[]
-是一个本地数组。它是从文本初始化的。但是整个缓冲区的持续时间是自动的。返回时,它将衰减为指针(返回
str
的地址)。缓冲区超出范围,因此地址导致指针悬空。

两个版本的
str
都具有自动存储持续时间。但它们的类型不同,这就造成了所有的不同

char*str
-是一个指针。它指向一个字符串文本。文本的存储持续时间是静态的。返回
str
,将返回文本的地址(返回
str
的内容),一切正常


char str[]
-是一个本地数组。它是从文本初始化的。但是整个缓冲区的持续时间是自动的。返回时,它将衰减为指针(返回
str
的地址)。缓冲区超出范围,因此地址导致指针悬空。

字符串文字具有整个程序执行的生命周期,它们永远不会超出范围。因此,指向它们的指针总是有效的

正如您所指出的,第二个示例中的数组具有自动存储功能,一旦函数返回,数组将超出范围,返回的指针无效


还有一个关于数组示例中注释的小说明:

char str[] = "GfG"; /* "GfG" is stored in read only part of shared segment */ 
上述评论是错误的。当您初始化一个数组时,编译器会自动设置该数组,在这种情况下没有字符串文字

上面数组的定义和初始化相当于

char str[4] = { 'G', 'f', 'G', '\0' };

我希望数组示例的注释与指针示例的注释相同,因为粘贴的副本不正确?

字符串文字有整个程序执行的生命周期,它们永远不会超出范围。因此,指向它们的指针总是有效的

正如您所指出的,第二个示例中的数组具有自动存储功能,一旦函数返回,数组将超出范围,返回的指针无效


还有一个关于数组示例中注释的小说明:

char str[] = "GfG"; /* "GfG" is stored in read only part of shared segment */ 
上述评论是错误的。当您初始化一个数组时,编译器会自动设置该数组,在这种情况下没有字符串文字

上面数组的定义和初始化相当于

char str[4] = { 'G', 'f', 'G', '\0' };

我希望数组示例的注释与指针示例的注释相同,因为粘贴错误?

在第一个代码段中,变量
str
声明为

char *str = "GfG"; 
确实是函数的局部变量,具有自动存储持续时间,在退出函数后将不活动

但是,变量指向的字符串文字本身具有静态存储持续时间,其寿命不依赖于函数调用。退出该功能后,它将处于活动状态。因此,函数返回指向字符串文字的第一个字符的指针

在第二种情况下,声明了一个本地数组

char str[] = "GfG"; 
由字符串文本的字符初始化的。退出功能后,它将不再处于活动状态。因此,指向数组第一个字符的指针将无效

如果要像这样声明,可以使用字符数组实现与第一个代码段中的字符串文字相同的效果

static char str[] = "GfG"; 

在这种情况下,函数可能会返回指向数组第一个字符的指针,因为由于其静态存储持续时间,它在退出函数后将处于活动状态。

在第一个代码段中,变量
str
声明如下

char *str = "GfG"; 
确实是函数的局部变量,具有自动存储持续时间,在退出函数后将不活动

但是,变量指向的字符串文字本身具有静态存储持续时间,其寿命不依赖于函数调用。退出该功能后,它将处于活动状态。因此,函数返回指向字符串文字的第一个字符的指针

在第二种情况下,声明了一个本地数组

char str[] = "GfG"; 
由字符串文本的字符初始化的。退出功能后,它将不再处于活动状态。因此,指向数组第一个字符的指针将无效

如果要像这样声明,可以使用字符数组实现与第一个代码段中的字符串文字相同的效果

static char str[] = "GfG"; 

在这种情况下,函数可能会返回指向数组第一个字符的指针,因为由于其静态存储持续时间,它在退出函数后将处于活动状态。

第一个函数返回指向静态生存期字符串文字的指针,当
getString()
的作用域离开时,该字符串文字不会被销毁。但是在第二种情况下,
“GfG”
实际上不是一个字符串文本,并且没有静态生存期,它的生存期绑定到分配它的范围。这样,第二个返回的指针将无效,尝试读取它将调用未定义的行为。如果将
str[]
定义为
static char
,则在退出函数时它不会被销毁。选中此项,第一个返回指向静态生存期字符串文本的指针,该指针将