C 为什么以及如何返回静态变量的地址是正确的,而对非静态变量执行相同操作会产生错误的结果?

C 为什么以及如何返回静态变量的地址是正确的,而对非静态变量执行相同操作会产生错误的结果?,c,static,C,Static,这个定义不起作用,但是 char str[] = "hello"; 这行得通,为什么 完整代码: static char str[] = "hello" 万一 char *retstr(void) { char str[] = "hello"; //This definition dosnt work return str; } int main() { printf("\n%s\n",retstr());

这个定义不起作用,但是

char str[] = "hello";
这行得通,为什么

完整代码:

static char str[] = "hello" 
万一

char *retstr(void)
    {
        char str[] = "hello"; //This definition dosnt work
        return str;
    }

    int main()
    {
        printf("\n%s\n",retstr());
        return 0;
    }
您正在尝试返回局部变量
str
的地址。这里使用返回值,因为一旦
retstr()
函数完成执行,就不存在
str
变量

奥托

 char str[] = "hello"; //This definition dosnt work
工作正常,因为
static
变量作为静态存储持续时间。它的生命周期是程序的整个执行过程。因此,即使在
retstr()
函数完成执行之后,
str
仍然有效,因此返回值可以有效使用

相关:
C11
,第§6.2.4章,物体的储存期限,第3段

。。。使用存储类 说明符
static
,具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次

万一

char *retstr(void)
    {
        char str[] = "hello"; //This definition dosnt work
        return str;
    }

    int main()
    {
        printf("\n%s\n",retstr());
        return 0;
    }
您正在尝试返回局部变量
str
的地址。这里使用返回值,因为一旦
retstr()
函数完成执行,就不存在
str
变量

奥托

 char str[] = "hello"; //This definition dosnt work
工作正常,因为
static
变量作为静态存储持续时间。它的生命周期是程序的整个执行过程。因此,即使在
retstr()
函数完成执行之后,
str
仍然有效,因此返回值可以有效使用

相关:
C11
,第§6.2.4章,物体的储存期限,第3段

。。。使用存储类 说明符
static
,具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次

这是您返回的本地地址。这就是它不起作用的原因

char str[] = "hello"; //This definition dosnt work
return str;
在本例中,您将“str”变量的作用域更改为整个程序。这就是它起作用的原因

这是您返回的本地地址。这就是它不起作用的原因

char str[] = "hello"; //This definition dosnt work
return str;

在本例中,您将“str”变量的作用域更改为整个程序。这就是它工作的原因。

不能从函数返回局部变量。局部变量存在于堆栈上,一旦函数完成,该堆栈空间将被释放并可供下一个函数调用使用

static char str[] = "hello" 
一旦超出范围,就不存在任何用于其他函数调用的名为
str
的变量

但是
static
变量生存期会在程序的整个运行过程中延长

char str[] = "hello"; //this won't work as it is a local variable

因此,在使用静态时,它不会给出任何错误。

您不能从函数返回局部变量。局部变量存在于堆栈上,一旦函数完成,该堆栈空间将被释放并可供下一个函数调用使用

static char str[] = "hello" 
一旦超出范围,就不存在任何用于其他函数调用的名为
str
的变量

但是
static
变量生存期会在程序的整个运行过程中延长

char str[] = "hello"; //this won't work as it is a local variable

因此,在使用
static
时,它不会给出任何错误。

静态变量只创建一次,在函数返回时不会被销毁,但在函数结束时局部变量会被销毁。
每次调用函数时都会创建局部变量,当函数返回时会被销毁。

对于局部变量:返回一个指向不再存在的字符串的指针。
对于全局变量:字符串仍然存在,因此它将始终工作


静态变量只创建一次,在函数返回时不会被销毁,但在函数结束时局部变量会被销毁。
每次调用函数时都会创建局部变量,当函数返回时会被销毁。

对于局部变量:返回一个指向不再存在的字符串的指针。
对于全局变量:字符串仍然存在,因此它将始终工作