c语言问题集二

欢迎访问个人小站,阅读此文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]访问了

 

转载于:https://my.oschina.net/toyandong/blog/65165

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值