c – 修改char * const字符串
作者:互联网
我知道const char *是一个指向const char的指针,而char * const是一个指向char的常量指针.
我在以下代码中测试它:
const char *s = "hello"; // Not permitted to modify the string "hello"
char *const t = "world"; // Not permitted to modify the pointer t
s = "hello2"; // Valid
// t = "world2"; // Invalid, gives compilation error
// *(s + 1) = 'a'; // Invalid, gives compilation error
*(t + 1) = 'a'; // Why does this not work?
最后一行不会给出任何错误,但会导致程序意外终止.为什么修改t指向的字符串是不允许的?
解决方法:
t指向字符串文字,修改字符串文字是未定义的行为. C草案标准第2.14.5节字符串文字第12段说(强调我的):
Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation defined. The effect of attempting to modify a string literal is undefined.
C99标准草案的相关部分是6.4.5字符串文字第6段,其中说明(强调我的):
It is unspecified whether these arrays are distinct provided their elements have the
appropriate values. If the program attempts to modify such an array, the behavior is
undefined.
在典型的现代Unix平台上,您将在只读段中找到字符串文字,如果我们尝试修改它,将导致访问冲突.我们可以使用objdump来检查只读部分,如下所示:
objdump -s -j .rodata
我们可以在下面的live example中看到,字符串文字确实可以在只读部分中找到.请注意,我必须添加printf,否则编译器会优化字符串文字.示例`objdump输出:
Contents of section .rodata:
400668 01000200 776f726c 64002573 0a00 ....world.%s..
另一种方法是指向一个带有字符串文字副本的数组,如下所示:
char r[] = "world";
char *const t = r ;
标签:c-3,c,string,pointers,runtime-error 来源: https://codeday.me/bug/20190918/1811217.html