gpt4 book ai didi

C:所有字符串文字都有静态存储期限吗?

转载 作者:行者123 更新时间:2023-12-04 16:04:48 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





String literals: Where do they go?

(8 个回答)


2年前关闭。




我一直在阅读各种来源,字符串文字在程序的整个生命周期中都保留在内存中。在那种情况下,这两个函数之间有什么区别

char *f1() { return "hello"; }
char *f2() {
char str[] = "hello";
return str;
}

虽然 f1编译正常, f2提示我正在返回堆栈分配的数据。这里会发生什么?
  • 如果str指向实际的字符串文字(具有静态持续时间),为什么会出现错误?
  • 如果字符串文字被复制到局部变量 str ,原始字符串文字去哪里了?它是否保留在内存中而不引用它?
  • 最佳答案

    这个

    char str[] = "hello";

    是由字符串文字 "hello" 初始化的本地数组的声明.

    实际上,这与您通过以下方式声明数组相同
    char str[] = { 'h', 'e', 'l', 'l', 'o', '\0' };

    即数组自己的内存区域(具有自动存储持续时间)由字符串文字初始化。

    退出函数后,数组将不存在。

    这就是功能
    char *f2() {
    char str[] = "hello";
    return str;
    }

    尝试返回指向本地字符数组第一个元素的指针 str具有自动存储持续时间。

    至于这个函数定义
    char *f1() { return "hello"; }

    然后函数返回一个指向字符串文字 "hello" 第一个字符的指针这确实具有静态存储持续时间。

    你可以想象第一个函数定义如下
    char literal[] = "hello";
    char *f1() { return literal; }

    现在比较数组在第一个函数定义和第二个函数定义中的定义位置。

    在第一个函数定义中,数组 literal是全局定义的,而在第二个函数定义中,数组 str在本地定义。

    if the str points to the actual string literal (which has static duration), why do I get an error?


    str不是指针。它是由字符串文字初始化的命名内存范围。即数组的类型为 char[6] .

    在返回语句中
    return str;

    该数组被隐式转换为指向其第一个类型 char * 的元素的指针。 .

    C 和 C++ 中的函数可能不返回数组。在 C++ 中,函数可以返回对数组的引用。

    关于C:所有字符串文字都有静态存储期限吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667780/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com