请问有人见过struct s *get_s_ptr(int *a_ptr) 这样的定义吗?

limlzm 2004-08-10 02:42:37
昨晚遇到一个问题。
# Given a pointer to member a within a struct, write a routine that returns a pointer to the struct.
(据说是印度的高级unix/linux编程题)
struct s
{
...
int a;
};

struct s *get_s_ptr(int *a_ptr)
{
填空
}
请问有哪位高手见过这样的定义?
该如何做呢?
...全文
268 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
limlzm 2004-08-10
  • 打赏
  • 举报
回复
受教,只弹出了一段警告/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stddef.h:414:1:warning: this is the location of the previous definition
能说说“限制了s的结构”是什么意思吗?
freefalcon 2004-08-10
  • 打赏
  • 举报
回复
包含头文件
stddef.h
其定义为:
#define offsetof(s,m) (size_t)&(((s *)0)->m)
limlzm 2004-08-10
  • 打赏
  • 举报
回复
to freefalcon(心宇—小小菜鸟想高飞) :其实我不是想改,而是编译不过阿,man 不到offsetof
yang_cppprogrammer 2004-08-10
  • 打赏
  • 举报
回复
struct s* get_s_ptr(int *a_ptr)
{
struct s* ps = (struct s*)0;
int len = (int) (&(ps->a));
return (struct s*)((int)a_ptr-len);
};
多看看Linux源代码吧.
freefalcon 2004-08-10
  • 打赏
  • 举报
回复
晕了,居然还说没有一个不正确
--〉
晕了,居然还说没有一个正确
freefalcon 2004-08-10
  • 打赏
  • 举报
回复
晕了,居然还说没有一个不正确

去看看offsetof的定义吧,位于stddef.h中
本来大家说得都是一样的,却要说别人不对,晕

楼主那样改是画蛇添足,你限制了s的结构
antijpn 2004-08-10
  • 打赏
  • 举报
回复
没看到楼上一个正确的:)
下面的实现是在slab内存管理中看到的,楼主注意了:


struct s *get_s_ptr(int *a_ptr)
{

return (struct s *) ((char *)a_ptr - (unsigned long) (&((struct s *)0)->a));


}
这个正好是我所说的不考虑定义指针不创建对象的方法,本质上这个方法和我上面提出的没有区别,还是通过了对象的定义去做
antijpn 2004-08-10
  • 打赏
  • 举报
回复
这种方法要求给出的地址是最后一个元素的,不知道有什么办法不定义struct对象,并且可以通过struct中未知位置的元素来得到struct对象的地址?
我的办法定义了struct对象,还有其他人有办法吗(不考虑定义指针不创建对象的方法)?
rockhard 2004-08-10
  • 打赏
  • 举报
回复


没看到楼上一个正确的:)
下面的实现是在slab内存管理中看到的,楼主注意了:


struct s *get_s_ptr(int *a_ptr)
{

return (struct s *) ((char *)a_ptr - (unsigned long) (&((struct s *)0)->a));


}
limlzm 2004-08-10
  • 打赏
  • 举报
回复
现在终于弄明白了:其实考点就是偏移量,int *a_ptr 结构里面的int a 的一个地址,用(char *)a_ptr 得到他的首地址,通过-sizeof(s) + sizeof(int)得到 s 的首地址。下面是改了一下freefalcon(心宇—小小菜鸟想高飞)代码。并且在编译通过:
(下班前结贴好让大家学习学习,主要得分freefalcon(心宇—小小菜鸟想高飞), scxby() 和lemon520(喷血) )
#include "stdio.h"
struct s
{
//...
char c;
//...
int a;
};
struct s *get_s_ptr(int *a_ptr)
{
return (struct s *) ( (char*)a_ptr - sizeof(struct s) + sizeof(int) );
}
int main(void)
{
struct s _s;
_s.c = 'a';
_s.a = 123;

struct s* ps = get_s_ptr( &_s.a );
printf("%c, %d\n", ps->c, ps->a);

return 0;
}
peter9606 2004-08-10
  • 打赏
  • 举报
回复
有什么问题么?
grooving 2004-08-10
  • 打赏
  • 举报
回复
cenlmmx(多看看多想想) 历害!

不过谁敢这么用?
peter9606 2004-08-10
  • 打赏
  • 举报
回复
struct s *get_s_ptr(int *a_ptr)
{
return (struct s*) a_ptr -sizeof(struct s) + sizeof(int) ;
}
peter9606 2004-08-10
  • 打赏
  • 举报
回复
mark~
lemon520 2004-08-10
  • 打赏
  • 举报
回复
我倒!

# Given a pointer to member a within a struct, write a routine that returns a pointer to the struct.

#写一个程序,通过指向结构成员a的指针返回这个指向这个结构s的指针,就是通过a的地址得到s的地址;
limlzm 2004-08-10
  • 打赏
  • 举报
回复
其实题目问的是什么?
lemon520 2004-08-10
  • 打赏
  • 举报
回复
struct s *get_s_ptr(int *a_ptr)
{
return (struct s*)((char*)a_ptr-offsetof(s,a));
}
antijpn 2004-08-10
  • 打赏
  • 举报
回复
不知道有什么办法可以不定义一个struct对象就取得中间间隔的字符数,看看有没有人能行的
Shires 2004-08-10
  • 打赏
  • 举报
回复
mark
antijpn 2004-08-10
  • 打赏
  • 举报
回复
计算的话也不是很麻烦,主要是取得中间间隔的字节数
struct s instance;
int val=(int)&instance-(int)&instance.a;
return (struct s*)((char*)a_ptr-val);
加载更多回复(7)

69,382

社区成员

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

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