C 中常见的编程错误

来源:互联网 发布:软件测试行业方向 编辑:程序博客网 时间:2024/04/25 13:08

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;则会在编译时出现以下错误: