是全局内存中的本地常量字符串

时间:2012-12-25 03:09:44

标签: c

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

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

Q1:现在可以安全地在test处使用地址内容。
Q2:如果test在DLL中。其他程序使用方可以安全使用 问题3:如果安全的话。当我将另一个const字符串重新分配给变量str时。旧的const字符串是否会被释放

4 个答案:

答案 0 :(得分:1)

如果仅从代码角度来看,这是安全的。但是你应该确保在test()中,你只能将一个字符串const赋给str。如果您喜欢以下内容:

const char *test() {
  char somestr[somesize];
  str = somestr;
  return str;
}

那仍然不安全。

答案 1 :(得分:1)

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

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

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

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

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

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

答案 2 :(得分:0)

甚至不需要分配给str。即使没有它,从函数返回字符串文字的地址并随后在任何地方使用字符串都是安全的。

答案 3 :(得分:0)

如果你为指针指定一个字符串文字是安全的,但如果你要这样做,似乎最好将该函数完全从图片中删除:

static char str[] = "hello world";

然后你可以像str一样使用static char *,因为数组只会衰减为指针。