【问题标题】:If referencing constant character strings with pointers, is memory permanently occupied?如果用指针引用常量字符串,内存会永久占用吗?
【发布时间】:2011-09-22 22:59:04
【问题描述】:

在运行 c 程序时,我试图了解事物在内存中的存储位置(堆栈/堆,还有其他吗?)。编译它会给出警告:局部变量的函数返回地址:

char *giveString (void)
{
    char string[] = "Test";
    return string;
}
int main (void)
{
    char *string = giveString ();
    printf ("%s\n", string);
}

运行会给出各种结果,它只会打印出乱码。我从中收集到,在 giveString() 中称为 string 的 char 数组在运行时存储在 giveString() 函数的堆栈帧中。但是,如果我将 giveString() 中的字符串类型从 char 数组更改为 char 指针:

char *string = "Test";

我没有收到任何警告,程序打印出“测试”。那么这是否意味着字符串“Test”现在位于堆上?它似乎不再出现在 giveString() 的堆栈帧中。这两种情况到底发生了什么?如果这个字符串位于堆上,所以程序的所有部分都可以通过指针访问它,在程序终止之前它永远不会被释放吗?或者如果没有指向它的指针,是否会释放内存空间,就像我没有将指针返回给 main 一样? (但这只有在 Java 中这样的垃圾收集器才有可能,对吧?)这是堆分配的一种特殊情况,仅适用于指向常量字符串(硬编码字符串)的指针吗?

【问题讨论】:

    标签: c pointers malloc


    【解决方案1】:

    您似乎对以下语句的作用感到困惑。

    char string[] = "Test";
    

    这段代码的意思是:在本地栈帧中创建一个足够大的数组,并将常量字符串“Test”的内容复制到其中。

    char *string = "Test";
    

    这段代码的意思是:设置指针指向常量字符串“Test”。

    在这两种情况下,“测试”都位于二进制文件的 constcstring 段中,其中存在不可修改的数据。它既不在堆也不在堆栈中。在前一种情况下,您正在制作可以修改的“测试”副本,但是一旦您的函数返回,该副本就会消失。在后一种情况下,您只是指向它,因此您可以在函数返回后使用它,但永远不能修改它。

    您可以将实际字符串“Test”视为全局且始终存在于内存中,但分配和释放的概念通常不适用于 const 数据。

    【讨论】:

      【解决方案2】:

      没有。字符串"Test" 仍在堆栈中,它只是在堆栈的data 部分中,基本上是在程序运行之前设置的。它就在那里,但你可以把它想象成“全球”数据。

      以下内容可能会为您清除一点:

      char string[] = "Test"; // declare a local array, and copy "Test" into it
      char* string = "Test";  // declare a local pointer and point it at the "Test"
                              // string in the data section of the stack
      

      【讨论】:

      • 常量字符串不会被放入堆栈 - 大多数编译器会将其放入只读代码部分,尽管过去许多编译器会将其放入初始化数据部分。堆栈的“数据部分”是什么?
      【解决方案3】:

      这是因为在第二种情况下,您正在创建一个常量字符串:

      char *string = "Test";
      

      string指向的值是一个常量,永远不会改变,所以它是在编译时像静态变量一样分配的(但它仍然是堆栈而不是堆)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 2015-07-23
        • 2023-04-09
        • 2020-10-12
        相关资源
        最近更新 更多