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