1. 复合字面值
char *get_status_str(int status) { return (char *[]){"linkdown","partial-linkup","full-linkup","N/A"}[status]; }
2. 常量折叠
#include <stdio.h> int main() { const int a=9; int *p=(int*)&a; *p=10; printf("%p %p\n", &a, p); //0012FF7C 0012FF7C printf("a: %d , *p %d\n",a,*p); //a: 9 ,*p: 10 return 0; }
具体参考:http://blog.csdn.net/yafeng_jiang/article/details/7101964
3. 系统里一些变量借来使用.
4. send recv并不是真正的发送接收,只是与socket缓冲区交互
5. 大小端转换
#define CHANGE_ENDIAN_DW(data) (data<<24 | data>>24 | data>>8&0xff00 | data<<8&0xff0000)
6. 参数传递二维数组
当二维数组作为函数参数传递给函数时,函数形参可以是(int *p[], 或者int **p),但在函数体里面会把二维数组作 为一维处理,这时候先强制转换一位数组,按照步进处理。
如二维数组转置:
void matrix_transpose(int *src[], int *dst[], int x, int y) { int i, j; int *psrc, *pdst; i = j = 0; psrc = (int *)src; pdst = (int *)dst; for(i = 0; i < x; i++) { for(j = 0; j < y; j++) { *(pdst + j*x + i) = *(psrc + i*y + j); } } }
7.看到CU问答上的一个关于locatime的问题:http://ask.chinaunix.net/question/785566
发现:系统提供的函数:getpwuid ()和 getgrgid() 调用时存在内存泄漏。而localtime并未出现内存泄漏。
问题1:getpwuid 、 getgrgid等函数内存泄漏的合理内因是什么?
问题2:假设getpwuid 、 getgrgid等函数内存泄漏有其合理性的意义,localtime函数的返回值与前两个函数的返回值 类似,请问它是如何做到不泄露的?
答复: 大数据处理函数存在一个数据结果谁调用谁释放的问题,而localtime不算是这类的。
答复2: localtime返回的是static变量,是不可重入的,可以使用localtime_r()代替.
8. 柔性数组 flexible array
http://coolshell.cn/articles/11377.html
访问成员数组名其实得到的是数组的相对地址,而访问成员指针其实是相对地址里的内容
#include <stdlib.h> #include <string.h> struct line { int length; char contents[0]; // C99的玩法是:char contents[]; 没有指定数组长度 }; int main(){ int this_length=10; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length; memset(thisline->contents, 'a', this_length); return 0; }