char *变量是否指向字符串(在源代码中写入)是否正常? 我可以操作/修改为文字字符串分配的空间,只要我不超过它的长度吗? 尽管我理解可执行文件的格式,但这很好,但我想确定。谢谢:))
答案 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。你可以指向他们,但不要写他们。你有两个选择:
实际数组:
char s[] = "Hello you beautiful people";
这是有效的,因为你没有指向文字字符串;你正在将数组(可写)初始化为文字字符串的内容。
将字符串复制到可写内存:
char *s = malloc(30);
strncpy(s, "Hello you beautiful people", 30);
答案 3 :(得分:1)
尝试修改字符串文字会调用未定义的行为。最好将字符串文字视为不可写。