《C陷阱与缺陷》笔记
1、如果f是一个函数,则
f();
指调用该函数,
而
f;
却什么也不做,准确的说,这个语句计算函数f的地址,但并不调用该函数。
2、C语言允许初始化列表出现多余的逗号,是为了对称。
如:
int days[] = {1, 2, 3, 4, 5, 6, 7,};
最后有逗号是正确的。
3、malloc要注意是否申请成功,和最后的free。
4、strcpy的目标要申请好了内存。
5、溢出的结果是未定义的。
6、strcpy只用于字符串复制,memcpy用于一般内存的复制。
strcpy根据\0判断结束否,memcpy根据第三个参数的长度判断结束。
实现如下:
char * strcpy(char * dest, const char * src) // 实现src到dest的复制 { if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性 return NULL; char *strdest = dest; //保存目标字符串的首地址 while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下 return strdest; }
void *memcpy(void *memTo, const void *memFrom, size_t size) { if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效 return NULL; char *tempFrom = (char *)memFrom; //保存memFrom首地址 char *tempTo = (char *)memTo; //保存memTo首地址 while(size -- > 0) //循环size次,复制memFrom的值到memTo中 *tempTo++ = *tempFrom++ ; return memTo; }
7、#define T1 struct foo *
typedef struct foo *T2;
T1 a, b;
T2 a, b;
8、标识符名称的限制,ANSI C规定,C实现必须能够区别出前6个字符不同的外部名称。
9、a+++++b
根据贪心法,上面表达式是错误的,因为会被解析为 a++ ++ +b即((a++)++)+b,而a++不能作为左值。