char *指向文字字符串(源代码中硬连线)可以吗?

时间:2010-01-14 19:07:06

标签: c

char *变量是否指向字符串(在源代码中写入)是否正常? 我可以操作/修改为文字字符串分配的空间,只要我不超过它的长度吗? 尽管我理解可执行文件的格式,但这很好,但我想确定。谢谢:))

4 个答案:

答案 0 :(得分:9)

取决于您的运行时特性,但通常会做类似的事情:

char *s = "a literal string";
s[3] = 'q';

将编译,但不会在运行时工作。在这种情况下,文字字符串通常位于可执行文件的只读部分。但是,以下示例将起作用:

char s[] = "a literal string";
s[3] = 'q';

在这种情况下,文字字符串是堆栈上数组(s)的初始化器。所以第一个问题的答案是“是”,第二个问题的答案是“也许”。

这两个例子之间存在语义差异。第一个创建一个指向文字字符串的指针,第二个创建一个数组并使用文字字符串的内容对其进行初始化。

答案 1 :(得分:2)

  

char *变量是否指向字符串(在源代码中写入)是否可以?

通常可以,但是我将指针标记为const以防止意外修改。

示例:const char *Str = "This is a hard string.";

  

我可以操作/修改为文字字符串分配的空间,只要我不超过它的长度吗?

我不推荐这个。如果需要修改字符串,请将其复制到已分配的内存块中。

答案 2 :(得分:1)

文字字符串总是const。你可以指向他们,但不要写他们。你有两个选择:

  1. 实际数组:

    char s[] = "Hello you beautiful people";
    

    这是有效的,因为你没有指向文字字符串;你正在将数组(可写)初始化为文字字符串的内容。

  2. 将字符串复制到可写内存:

    char *s = malloc(30);
    strncpy(s, "Hello you beautiful people", 30);
    

答案 3 :(得分:1)

尝试修改字符串文字会调用未定义的行为。最好将字符串文字视为不可写。