c - C中的自动存储类持续时间

标签 c scope

我正在努力加深对 C 的理解,并希望了解自动存储类。

因此 auto 变量的持续时间为自动,因此它在调用它的 block 的末尾停止存在。

这段代码:

int main(void){
    char* name;
    name=return_name();
    printf("Name is: %s\n Addr is: %p\n", name,name);
    return 1;  
}

 char* return_name(void){
    char* n="Waldo";
    printf("Name is: %s & Addr is: %p\n", n,n);
    return n;
}

会输出类似这样的东西:

Name is: Waldo & Addr is: 0xABCDEF
Name is: Waldo & Addr is: 0xABCDEF

所以忘记了变量n,但是通过name记住了地址。地址中的数据保持不变。

但是,我在某处读到,由于可变持续时间是自动的,函数调用结束后;内存地址被释放回程序,以后可能会被程序覆盖?因此,如果您希望保留该地址,则必须使用静态声明 n

我似乎找不到我读到这篇文章的来源,我只是想确定一下。

谢谢

编辑:我并不是要在 return_name 中递归调用 return_name。我删除了该函数中的 name=return_name 行。

最佳答案

The variable n is forgotten, but the address is remembered through name.

你在这里肯定遇到了一些非常重要的事情:事实上,变量 n 超出了范围,它曾经拥有的值被记住只是因为你分配了 n 的返回值main 中的 name

该变量是一个指针,因此这里有两条信息在起作用:字符串的值和存储其地址的变量。指针被销毁,但值仍然存在。只要有指向它的指针,就可以访问该值。

I read somewhere that after the function call ends since the variable duration was automatic; the memory address is released back to the program and it could potentially be overwritten by the program later?

变量 n 确实如此:程序可以将其内存重新用于它需要的其他事情。但是,对于 n 指向的值,情况并非如此:字符串文字 "Waldo" 的值不在自动存储中,因此不会被释放.

你的代码表现良好,但你需要非常小心,因为你可以很容易地通过将字符串文字复制到自动内存中使其成为未定义的行为:

char* return_name(void) {
    char n[] = "Waldo"; // <<== Changed
    name=return_name();
    printf("Name is: %s & Addr is: %p\n", n, (void*)&n[0]);
    // Dereferencing the return is undefined behavior
    return n;
}

n 声明中的一个小改动会导致您的程序的行为变得未定义。

关于c - C中的自动存储类持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47087458/

相关文章:

c - 在处理命令行参数时如何在 C 中考虑空格

javascript - Javascript 的 Scope 如何工作,出现意外行为?

java - Play 框架无法将 #{set} 标签分配的变量读取到 #i{if} 标签中?

javascript - 从匿名函数作用域中提取数据

c++ - 在不使用动态内存分配的情况下声明可变大小的数组

在不使用匿名函数的情况下创建函数适配器

c - 无效插入/列表不起作用 - C

c - 如何在 C 的 main 函数中将参数从 char 转换为 int?

c++ - C 文件* 到 ostream/istream

c++ - 作为宏参数的范围内的枚举声明