请考虑以下代码:
int main() { char *p = "abcd"; p[0] = 'x'; return 0; }
是否可以通过标准保证在任何环境中工作?
我担心一些编译器决定将字符串存储的内存标记为只读,并尝试修改它会在运行时生成分段错误.但是,在我测试过的所有环境中,它都有效.
Standard确认对字符串文字的任何修改都可能导致未定义的行为.
C11-§6.7.9/ 32
[...]数组的内容是可修改的.另一方面,声明
char *p = "abc";
p
使用"指向char
"的类型定义并将其初始化为指向类型为"array ofchar
"且长度为4 的对象,其元素使用字符串文字初始化.如果尝试使用p
修改数组的内容,则行为未定义.
请注意,当调用未定义的行为时,您可能会得到预期或意外的结果.在这种情况下,无法保证您始终会出现分段错误或程序崩溃.
建议阅读:comp.lang.c常见问题列表·问题8.5