C 使用指向字符的指针而不是字符数组时出错
可能重复:C 使用指向字符的指针而不是字符数组时出错,c,arrays,pointers,C,Arrays,Pointers,可能重复: 我在Ubuntu中使用带有C语言的GCC编译器;我有这个计划: void foo(char *word) { //something stupid *word = 'z'; } int main() { char word1[] = "shoe"; char *word2 = "shoe"; foo(word1); printf("%s", word1); foo(word2); printf("%s", wor
我在Ubuntu中使用带有C语言的GCC编译器;我有这个计划:
void foo(char *word)
{
//something stupid
*word = 'z';
}
int main()
{
char word1[] = "shoe";
char *word2 = "shoe";
foo(word1);
printf("%s", word1);
foo(word2);
printf("%s", word2);
}
那么有什么区别呢?对于后者,我得到一个
分段错误错误。区别在于第一个是有效代码,而第二个是未定义的行为(因为不允许修改字符串文字)。请参阅。字符1[]=“shoe”代码>创建一个5个字符的数组,并将字符串文本“shoe”复制到其中(可以修改)
char*word2=“鞋”
创建一个指向字符串文本“shoe”(无法修改)的指针。问题在于您的char*word2=“shoe”代码>存储在.rodata
中:
(如果将shoe
存储在一个变量中,将foot
存储在另一个变量中,则更容易查看。)
允许编译器将字符串常量存储在只读内存中,因为标准不允许修改字符串文本
第一种情况是显式初始化的字符数组;标准允许修改它们,因此它们不存储在只读部分。如果每次有人问我修改const char*
…@EdS时我都有一美元,但它不是const char*
。C中的字符串文字不是常量const
;试图修改它们只是未定义的行为。(它们是C++中的代码> const ),对,这是一个糟糕的设计决策。他们应该是const,但我承认我错过了C标签并假设C++。
$ readelf -p .rodata adum
String dump of section '.rodata':
[ 4] shoe
[ 9] %s