+ -
当前位置:首页 → 问答吧 → 高手进:c 函数中 关于 0 地址问题

高手进:c 函数中 关于 0 地址问题

时间:2010-07-22

来源:互联网

本帖最后由 xuan_oscar 于 2010-07-22 17:37 编辑

如果我建立一个函数

typedef struct Name{
    int len;
    char value[10]
} name;
void sayhello()
{
     name a = 0;
}

请问这么写 (unsigned long)(&((name*)0)->value)  啥意思 ? 希望我描述清楚了。

多谢

作者: xuan_oscar   发布时间: 2010-07-22

先顶下

作者: xuan_oscar   发布时间: 2010-07-22

name a = 0;
=====
这样写能编译通过么。。。

(unsigned long)(&((name*)0)->value)
=====
这个&是干嘛的,这里value本来就是地址了啊,int 32位的话,那 ->value 就是4了。怎么还要用&取地址啊。

作者: pandaiam   发布时间: 2010-07-22

本帖最后由 davelv 于 2010-07-22 17:58 编辑

当运算符计算到->的时候,在大部分系统下悲剧的非法访问了。
如果某些系统可以用的话,
_________________________________________________________
以上发言为错误认识,我想当然了,sorry!!!
表达式的值为4.
对数组名也可以取地址,得到的数值和直接使用数组名是一样的,但是类型不一样。

作者: davelv   发布时间: 2010-07-22

求结构体成员的偏移量~

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

作者: efolzl   发布时间: 2010-07-22

这个数组名加不加&一样的

作者: zliming   发布时间: 2010-07-22



QUOTE:
当运算符计算到->的时候,在大部分系统下悲剧的非法访问了。
如果某些系统可以用的话,表达式的值为4.
对 ...
davelv 发表于 2010-07-22 17:52




    ->这个是编译器计算,运行时直接是 p + [4];没有运算

作者: zliming   发布时间: 2010-07-22

请问楼上,
这里MEMBER如果不是数组名的话加上&还好,
但是是数组名的话加上&还对么。。

作者: pandaiam   发布时间: 2010-07-22



QUOTE:
->这个是编译器计算,运行时直接是 p + [4];没有运算
zliming 发表于 2010-07-22 17:57


刚才写个程序测试下,自己想当然了,谢谢提醒。

作者: davelv   发布时间: 2010-07-22

编译器& *对数组是特别的

作者: zliming   发布时间: 2010-07-22

多谢 zliming,这个是想要的

作者: xuan_oscar   发布时间: 2010-07-22

回复 pandaiam


    对数组名取地址仍然指向该数组

作者: 俺小时候可帅了   发布时间: 2010-07-22

例子是随笔写的 不够严谨,确实数组就没有意义 ,谢谢大家帮助,今天学了一种链表的新方法

作者: xuan_oscar   发布时间: 2010-07-22