采取以下两种形式创建字符串:
const char* pt1 = "Hello";
char* pt2 = "Goodbye";
上面有什么用const
?以我的理解,
ptr = "Adios";
两者均适用,因为这会更改指针的地址,但是尝试更改字符串中的字母将对两者均失败:
const char* pt1 = "Hello";
编译器错误:分配只读位置
char* pt2 = "Goodbye";
运行时错误:seg错误,试图更改.rodata
由于它们产生相同的结果(即错误),因此const
在定义字符串时使用有什么好处吗?
定义指向字符串常量(也就是字符串文字)的指针,const char *
如果您尝试在代码中的其他地方尝试修改pt1
指向的字符串常量,则编译器可以检测到错误的访问,*pt1 = 'A';
而如果使用pt1
type char *
,则会在运行时具有未定义的行为,从而导致在某些架构上发生崩溃,而对其他架构的影响则不太明显,但潜在的破坏性更大。
为了扩展这个主题,有时const
对于指针定义的含义会感到困惑:
const char *pt1 = "Hello";
定义一个可修改的指针pt1
,该指针指向char
无法通过它修改的数组。由于"Hello"
是字符串常量,因此它是的正确类型pt1
。pt1
可以修改为指向另一个字符串,或者char
,可以修改或不修改,或者设置为NULL
。
char *pt2 = "Hello";
定义一个可修改的指针pt2
,该指针指向char
可以通过其修改的数组。尽管C标准"Hello"
具有与历史代码兼容的恒定性,但仍允许这样做。gcc和clang可以使用-Wwrite-strings
命令行选项禁用此行为。我强烈建议使用此警告以及更多警告以避免常见错误。
const char * const pt3 = "Hello";
定义一个常量指针pt3
,该指针指向char
不能通过它修改的数组。pt3
无法修改为指向另一个字符串,甚至不能设置为NULL
。
char * const pt4 = "Hello";
定义一个常量指针pt4
,该指针指向char
可以通过其修改的数组。pt4
初始化后无法更改。
char
并且const
可以放置在任何顺序,但无论const
是之前或之后*
产生很大的差别。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句