c - 是全局内存中的局部常量字符串

标签 c

我是否定义了一个全局指针(char*)。然后给出一个常量字符串的地址。这个地址是否会被释放。例如:

static char *str;    
const char * test()
{
    str = "hello world";
    return str;
}

Q1:现在在任何地方使用test得到的地址内容是否安全。
Q2:如果测试在DLL中。通过其他程序在外部使用是否安全
Q3:如果安全的话。当我将另一个 const 字符串重新分配给变量 str 时。旧的const字符串会被释放吗

最佳答案

如果执行以下操作,则可以在任何地方使用 foo() 的结果。但是,您不应该修改或释放它。如果此代码是 DLL 或库的一部分,则无关紧要。

const char * foo() {
    return "hello";
}

// This is identical.
const char * foo() {
    const char *x = "hello";
    return x;
}

如果你想能够修改,你可以这样做。请注意,每次调用 foo() 都将引用同一 block 内存,因为 x 是静态的。请注意,在这里,您可以修改 x,但您仍然不应该释放它。

char * foo() {
    static char x[] = "hello";
    return x;
}

如果您希望能够释放 foo() 的结果,则必须使用 malloc() 分配空间。

关于c - 是全局内存中的局部常量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027352/

相关文章:

c - 我不明白下面提供的框架代码中的第 1 行

c - 如何使用列表项的 glib 函数释放内存

c - 检查字符串是否旋转回文的有效方法

c - Makefile.am 中应该出现什么以及将库链接到带有 Autotools 的程序的源代码?

c - 从内核到用户空间(DMA)

将 Ada 字符串转换为 C Void*

c - 二维数组,打印索引。?

c - 使用 dlmalloc 的段错误

c - 在 C 宏中的字符串化之前进行标记串联

c - Dll注入(inject)失败