gpt4 book ai didi

c - 为什么 char* 会导致未定义的行为,而 char[] 不会?

转载 作者:行者123 更新时间:2023-11-30 16:13:10 25 4
gpt4 key购买 nike

尝试修改字符串文字会导致未定义的行为:

char * p = "wikipedia"; 
p[0] = 'W'; // undefined behaviour

防止这种情况的一种方法是将其定义为数组而不是指针:

char p[] = "wikipedia"; 
p[0] = 'W'; // ok

为什么 char* 会导致未定义的行为,而 char[] 不会?

最佳答案

任何修改 C 字符串文字的尝试都具有未定义的行为。编译器可能会安排将字符串文字存储在只读存储器中(受操作系统保护,而不是字面上的 ROM,除非您使用的是嵌入式系统)。但语言并不需要这个;作为程序员,这取决于你是否能把事情做好。

足够聪明的编译器可能会警告您应该将指针声明为:

const char * p = "wikimedia";

尽管没有 const 的声明在 C 中是合法的(为了不破坏旧代码)。但无论有没有编译器警告,const 都是一个非常好的主意。

(在 C++ 中,规则有所不同;C++ 字符串文字与 C 字符串文字不同,实际上是 const。)

当您使用文字初始化数组时,文字本身仍然存在于程序镜像的潜在只读区域中,但它复制到本地数组中:

char s[] = "wikimedia"; /* initializes the array with the bytes from the string */
char t[] = { 'w', 'i', ... 'a', 0 }; /* same thing */

请注意,char u[] = *p 确实不起作用 - 数组只能从大括号初始值设定项进行初始化,以及来自字符串文字的 char 数组。

关于c - 为什么 char* 会导致未定义的行为,而 char[] 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58127323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com