C- 中的字符串是 char *str 真的等价于 char str [] 吗? [复制]
Posted
技术标签:
【中文标题】C- 中的字符串是 char *str 真的等价于 char str [] 吗? [复制]【英文标题】:strings in C- is char *str is really equivalent to char str []? [duplicate] 【发布时间】:2011-11-05 00:50:37 【问题描述】:可能的重复:Difference between char *str="STRING" and char str[] = "STRING"?Need some help with C programming
虽然此片段出现分段错误
int main(void)
char* str ="abcde";
str[strlen(str)-1] ='\0';
printf("%s",str);
return 0;
如果我把
char str [] ="abcde";
而不是完美工作的指针,你知道为什么会这样吗?
【问题讨论】:
问题的标题和正文提出了不同的问题。 顺便说一句,这个问题每周都会被问到。请在此处发布之前进行一些研究。 @Bertrand - 我在回答之前寻找了一个骗子,但找不到任何足以投票关闭的东西。你能链接到这个“明确”的答案吗? @awoodland,你想要几个? ***.com/questions/3862842/…***.com/questions/1880573/…***.com/questions/3268292/…这样的问题没什么好说的。 【参考方案1】:当您编写char *str = "abcde";
时,您会创建一个指向字符串文字的char
指针,您不能修改该指针。
当您编写char str[] = "abcde";
时,您创建了一个char
数组并将字符串文字复制到其中。这只是一个普通的char
数组,因此您可以随意修改它。
修改字符串文字是未定义的行为。这是一个经过深思熟虑的设计决策,允许将字符串文字放置在输出程序的特殊只读部分中。实际上,许多编译器和平台都会这样做(将其标记为只读意味着您只需要内存中的字符串副本,即使有多个程序实例正在运行)。这会导致您在平台上观察到的行为。
【讨论】:
【参考方案2】:char *str = "abcde";
str
是指向 char 的指针,它指向字符串文字。字符串文字存储在只读内存中。你不能修改它们。
char str[] = "abcde";
字符串文字"abcde"
被复制到数组str
中。所以你可以修改它。
【讨论】:
字符串字面量可以存储在只读内存中【参考方案3】:char *
是指向 char(字符串字面量)的指针,char []
是一个 char 数组。您不能修改字符串文字,但可以修改 char 数组。
【讨论】:
以上是关于C- 中的字符串是 char *str 真的等价于 char str [] 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
堆栈上 char 缓冲区/ASCII 字符串的 Rust 等价物是啥?