回答
char* c = "Hello World!";
是一个指向文字串,其典型地存储在一个只读存储器段。试图修改它是未定义的行为。指针字符串文字如这应该更适当地被定义为
const char *c = "Hello World!";
但const
常被省略(在C,至少)。
@Eric:好点 - 我现在编辑了答案,使它更精确一些。 – 2013-04-04 14:36:32
char* c = "Hello World!";
这里c
是指向一个字符串的指针,所以你不能修改它
你可以用这个来代替
char c[] = "Hello World!";
*c = 'h',
c
这里是char类型的数组,并包含字符串"Hello World!"
的字符,所以你可以修改它。
修改字符串文字是undefined behaviour。主要原因是编译器允许将"Hello World!"
放置在只读存储器中。
在另一方面,下面是细:
char c[] = "Hello World!";
*c = 'h';
向提问者解释他们是如何试图修改字符串文字而不是仅仅声明它是未定义的行为可能是有用的。 – 2013-04-04 14:31:24
您将c
指向字符串文字,很可能存储在只读内存段中,您无法更改它。即使你可以物理改变,如按照C时的参数:如果程序试图修改[字符串常量]
6.4.5(字符串)中
,该行为是不确定的。
如果您在堆(或堆栈)上分配内存,然后将该字符串复制到该位置,则可以根据需要更改它。
字符串像char * c = "Hello";
是字符串常量和存储在只读数据段,所以你不能对其进行修改[但一些编译器也允许]
堆中分配的字符串不是只读段,并因此免费被修改。
- 1. C++访问冲突
- 2. C++:字符串,结构和访问冲突写入位置
- 3. 覆盖属性冲突
- 4. 字符指针抛出访问冲突
- 5. C++ ffmpeg访问冲突
- 6. C++结构访问冲突
- 7. C#内存访问冲突
- 8. 指针访问冲突? - C++
- 9. C++访问冲突错误
- 10. C++ OpenGL glTexImage2D访问冲突
- 11. C#WPF 0xC0000005:访问冲突
- 12. C++切换访问冲突
- 13. 访问冲突
- 14. 访问冲突?
- 15. C字符串保持相互覆盖
- 16. 访问冲突分配自动完成字符串
- 17. TObjectList.Clear访问冲突
- 18. Marshal.PtrToStructure访问冲突
- 19. System.UStrClr访问冲突
- 20. OpenGL,访问冲突
- 21. glutBitmapString访问冲突
- 22. glGetTexImage访问冲突
- 23. 访问冲突DirectWrite
- 24. 访问冲突soxr
- 25. Git合并覆盖而不是冲突
- 26. Git pull只覆盖冲突文件
- 27. Jquery库冲突 - 覆盖不工作
- 28. MDM与钥匙串访问冲突
- 29. 覆盖访问类
- 30. TNetSharingManager访问冲突问题
在现代C++编译器中,这甚至不会编译,或者至少会发出严重警告。 – 2013-04-04 14:25:55
@KonradRudolph你的意思是这个'char * c =“ccxcv”';像char * const c一样行事;'? – 2013-04-04 14:27:22
@Stephane否,作为'char const *',“警告:从字符串文字转换为'char *'已弃用”。 – 2013-04-04 14:27:45