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 等价物是啥?

修改c字符串[重复]

字符变量 [] = 0;和 char var[1];在C中是等价的吗?

在C中用realloc()截断字符串?

C 乘以大数

编程语言中的char-int等价[关闭]