欢迎访问个人小站,阅读此文http://www.yandong.org/archives/376
- union的初始化问题
union str
{
int i ;
char c ;
short b;
} dao = {1,'a',2};
在原来的 ANSI C 中, 只有联合中的第一个命名成员可以被初始化。 C99 引入了 “指定初始值”, 可以用来初始化任意成员。所以编译上面那段代码会得出这样的信息
/endian.c:73:5: 警告:联合初始值设定项中有多余元素
/endian.c:73:5: 警告:(在‘dao’的初始化附近)
/endian.c:73:5: 警告:联合初始值设定项中有多余元素
/endian.c:73:5: 警告:(在‘dao’的初始化附近)
- 序列点的问题
像下面这样的代码,其结果都是未定义的
a[i] = i++;
int i=7; printf("%d\n", i++ * i++);
int i = 3; i = i++;
a ^= b ^= a ^= b;
f() + g() * h();//其中有共享的变量
这牵扯到一个叫序列点的概念,序列点是一个时间点(在整个表达式全部计算完毕之后或在 ||、 &&、 ? : 或逗号 运算符处, 或在函数调用之前), 此刻尘埃落定, 所有的副作用都已确保结束。 ANSI/ISO C 标准这样描述:
在上一个和下一个序列点之间, 一个对象所保存的值至多只能被表达式的 计算修改一次。而且前一个值只能用于决定将要保存的值。
第二句话比较费解。它说在一个表达式中如果某个对象需要写入, 则在同一表达式中对该对象的访问应该只局限于直接用于计算将要 写入的值。这条规则有效地限制了只有能确保在修改之前才访问 变量的表达式为合法。例如 i = i+1 合法, 而 a[i] = i++ 则非法。
- int相乘
int a = 100, b = 100;
long int c = a * b;//error
long int c= (long int)a*b;//error
long int c=(long int)a * b;//ok
- c结构体内存分配技巧
参考这个问题,http://www.oschina.net/question/583160_59691?p=0#AnchorAnswer247989
struct name
{
int namelen;
char namestr[1];
};
struct name *p;
p = (struct name*)malloc(sizeof(struct name) + sizeof(char) * (namelen - 1))
//再把数据域memset过去,就可以直接用p->namestr[i]访问了