关于形参和临时指针变量的问题

andevele 2012-03-31 02:50:41
下面这个宏,大家都知道是它是通过成员地址获得成员所在结构的首地址。

#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})

这里ptr形参实际上是指向member的,新创建的__mptr也是指向member的。

我的问题是:为何不直接使用传过来的member的指针变量ptr进行后面的操作而非要新创建一个临时指针变量__mptr来进行其他操作?

使用新创建的临时指针变量__mptr有何意义?



...全文
253 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
andevele 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

防止不小心修改ptr指向的值
由于形参是没有修饰符,所以如果不小心修改ptr所指向的值,编译器可能不会报错
所以引入__mptr并加上const修饰符,在后面如果不小心修改了指向的值,就会报错了
一种对源数据进行保护的机制
[/Quote]

嗯,对的。。。。
andevele 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

额 应该是这样的,比如:
struct Test{
char a;
};

int b;

如果没有那句的话是我是不是可以 Test* ptr= container_of(&b, Test, a)
这样呢?
[/Quote]


如果不从语义来看,我觉得你说的是正确的。
不过,应该还是你刚开始说的那样,就是用来保护地址中的内容不受改变,无论如何操作这个指针临时变量,它的内容始终不改变。。。

谢谢。。。。
andevele 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

不知道大家在说什么,这是一个古老的语法,作用是:

传入结构体类型名,某个成员的名字,该成员的地址,然后返回该成员所在结构体的地址。
[/Quote]

你没有仔细看帖子
qq120848369 2012-03-31
  • 打赏
  • 举报
回复
不知道大家在说什么,这是一个古老的语法,作用是:

传入结构体类型名,某个成员的名字,该成员的地址,然后返回该成员所在结构体的地址。
sundayX 2012-03-31
  • 打赏
  • 举报
回复
内存泄漏:
char *ptr=(char *)malloc(sizeof(char)*256);
然后调用某个方法后,在方法内部执行了。
ptr++;
那在外部free(ptr)时会发生什么情况呢?

原始内容修改:
如果上面执行ptr++后,又执行了*ptr='a';
将会修改原来的字符串了。

俺也是菜鸟,不知道对不?相互学习。
pengzhixi 2012-03-31
  • 打赏
  • 举报
回复
这样看来那一句是用做类型check的。
pengzhixi 2012-03-31
  • 打赏
  • 举报
回复
额 应该是这样的,比如:
struct Test{
char a;
};

int b;

如果没有那句的话是我是不是可以 Test* ptr= container_of(&b, Test, a)
这样呢?
pengzhixi 2012-03-31
  • 打赏
  • 举报
回复
查找了些资料似乎在某些编译器版本上如果没有那句的话会有警告。
半盒阿尔卑斯 2012-03-31
  • 打赏
  • 举报
回复
防止不小心修改ptr指向的值
由于形参是没有修饰符,所以如果不小心修改ptr所指向的值,编译器可能不会报错
所以引入__mptr并加上const修饰符,在后面如果不小心修改了指向的值,就会报错了
一种对源数据进行保护的机制
andevele 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

要是直接对原指针操作,首先会对那块内存失去引用,导致内存泄漏等问题。还可能会得倒不想得到的结果。
[/Quote]

为什么那块内存会失去引用?能否详细点。。。
andevele 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]

我想这么做是担心会修改ptr本身的值。
[/Quote]


你说的这个值是ptr指针所指向的地址中的内容,对不?

虽然它前面用了const,表明它是一个常量指针,目的是保护地址中的内容不会被修改,这看起来起了保护作用。但实际上如果直接使用ptr来进行后续的操作也是可以的,因为它只想操作地址,而并不是操作地址中的内容,对于保护地址中的内容好像多此一举了。

难道这样使用只是为了防止地址中的内容被修改?

pengzhixi 2012-03-31
  • 打赏
  • 举报
回复
我想这么做是担心会修改ptr本身的值。
pengzhixi 2012-03-31
  • 打赏
  • 举报
回复
额 看看typeof是个什么东东
sundayX 2012-03-31
  • 打赏
  • 举报
回复
要是直接对原指针操作,首先会对那块内存失去引用,导致内存泄漏等问题。还可能会得倒不想得到的结果。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧