其他分享
首页 > 其他分享> > c – 修改char * const字符串

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