一个让我昨晚没睡好觉的问题 又急又气!
#include <stdio.h>
#include <string.h>
void main()
{
char c[]= "i hm a boy ";
printf( "%c\n ",*(c+2));
*(c+2)= 'a ';
printf( "%c\n ",c[2]);
}
上面这个程序能正常运行 输出:h
i am a boy
是没有问题的,可当初做实验的时候我是将第五行字符数组定义成指针的,既:
char *c= "i hm a boy "; 编译通过,但程序执行到语句*(c+2)= 'a '; 时出错。
难道将C定义成指针就不可以修改原字符串的值了么?不太明白(可将C定义成指针后,其他操作都可以进行,惟独不能修改原字符串的值)我想是不是因为i hm a boy是字符串常量,不可以修改呢?那为什么将C定义成数组又可以修改呢?
谁能告诉我到底是编译器的问题还是我C没学好?万分感谢
[解决办法]
*(c+2)是一个地址,不能把 'a '给它。
[解决办法]
比较:
char c[]= "i hm a boy ";
这样定义,
是定义了 一个 char数组,
并且把 "i hm a boy " 这个字符串复制到这个数组中来,
*(c+2)= 'a '; 修改这个数组的第三个元素,对于这个数组是允许被修改的,
所以正确。
两种方式的区别就是,
char *c= "i hm a boy "; 只是定义一个指针,并指向常量首地址;
char c[]= "i hm a boy ";定义数组并把这个常量字符串复制过来,可以修改数组内容(当然对于原来的常量还是不允许修改的。不过,也不会去修改这个常量了)
[解决办法]
用char *c= "i hm a boy ";
c是指向常量字符串 "i hm a boy "的地址.因为是常量,所以你不能更改c+2指向的字符的值.
用char c[] = "i hm a boy "的话, 就把常量字符串的值copy到树组c里的,而c没定义const,故你可以更改.
[解决办法]
这个你看一下生成的汇编代码就明白了
你用数组的时候它是在堆栈里的
而用指针的话 它是常量 放在不可写入的段的