C语言有哪些常见的陷阱
在学习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