1、尝试修改字符串常量
char *p = "i'm hungry!";
p[0]= 's';
答案与分析:
上面的代码能成功通过编译,但会产生运行时的错误即造成内存的非法写操作。 "i'm hungry"实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。
2、没有结束标志‘\0‘的假字符串
char a[3] = "abc";合法吗?使用它有什么隐患?
printf("%s",a);
结果:输出abc后面跟着一堆乱码。将数组a的长度改为大于3就可以。也不要显示的添加字符串结束标志,以为在初始化字符串或使用scanf函数初始化时系统会自动在字符串结尾添加结束标志。
答案与分析:
在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为"abc",注意,它没有通常的字符串终止符'\0',因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。
3、将数组名作为左值
char a[3],b="China";
a=b;
printf("%s",a);
编译时提示出错:
因为数组名表示数组首元素的地址,其值不能改变所以数组名不能作为左值。
4、两个指针可以相减,但是相加没有意义
int a[10],*p1,*p2; p1=a; p2=&a[5]; printf("十六进制地址形式:&p1=%0x,&p2=%0x\n",p1,p2); printf("十进制地址形式:&p1=%d,&p2=%d,p2-p1=%d\n",p1,p2,p2-p1);
结果:
分析:(1245008-1244988)/4=20/4=5; 除以4因为sizeof(int)=4; p2-p1 即其所指字符的间距。
若p1+p2;则会在编译时出现以下错误: