Swift51.com
麦子学院 头像
麦子学院  2016-08-04 20:07

C语言有哪些常见的陷阱

回复:0  查看:2416  

学习C语言的过程中,我们不免会遇到很多陷阱,我把这些常见的陷阱总结起来,就是为了避免以后犯同样的错误。

1.1char array1[100]; 2 char* array2;二者都可以当指针用,使用时有何区别?

1中字符数组,存储于栈区,sizeof(array1)为100,aray1代表首元素首地址,不可以被赋值,array1[0]这样可以被赋值,数组大小确定,难以扩容

2中存储于字符常量区,sizeof(array2)为4,array2可以被赋值,array2[0]不可以被赋值,空间大小可变

2. 32位中,long型和指针占4个字节,64位中占8个字节

3.strcat连续拼接字符串时,每次都要找到结尾,解决方案时给结尾做标记

4.const在C语言中为只读变量,C++中为常量

5.一般机器默认小端存储,苹果机器为大端存储

6. char a[] = "Hello world";

sizeof(a) = 12注:sizeof时算\0,strlen时不算\0

sizeof(*a) = 1      sizeof(&a) = 4

当字符数组以函数参数形式存在时,sizeof为4

7.printf函数执行时,计算顺序是从后向前,输出顺序是从前向后,可以将printf函数中想成传入的参数,存储于栈区

8.

int a[] ={2,8,16,24};char* p1 = a;char* p2 = &a[3];

p2-p1 = ?

本题中,两个地址相减,求的是指针的偏移量,p1指向的内容是2,p2指向的内容是24,p2-p1为3个4字节大小,为12,又因为p1和p2的基本类型为1个字节,所以(3*4)/1=12

9.括号表示表达式,表达式要变成int类型计算;有符号要向无符号类型转换;小类型要向大类型转换

10.

(a=1)?2:3

a=1,表示整个表达式的值为1,所以输出为2

11.switch case语句中,每个case过后如若没有遇到break,则顺次向下执行

12.char a[100] = {'a','b','c','\0','1','2'};遇到'\0'字符串结束

char a[100] = {'a','b','c','0','1','2'};   '0'代表字符不是'\0'

char a[100] = {'a','b','c',0,'1','2'};     '\0'就是0,字符串结束

13.阿克曼函数ack(1,k) = 2+x;   ack(2,x) = 3+2*x;   ack(3,x) = 2^(x+3)-3;

14.在移位运算时,数据需要补位时,符号位是什么就补什么

int i = 0xf0000000;i >>=1; i=0xf8000000

15.常量数值不能进行自加自减运算

16.注意与或运算,与运算时,前面表达式为假时,与运算符后面的表达式不参与运算,输出为假,若为真,则再计算与运算符后面的表达式

或运算时,或运算符前面的表达式为真时,不计算或运算符后面的表达式,直接输出为1,若为假,则在计算或运算符后面的表达式

17.sizeof返回值为unsigned int,当int遇到了unsigned int时,转换为unsigned int进行计算

18.栈区空间的生命周期在遇到}时截止,在}之前返回栈区申请的空间不存在,因为被回收了,字符常量区的内容只能读不能向里面写

原文来自:博客园/zs0909zs