2015-10-12 39 views
0
struct foo { 
    long a; 
    float d; 
    void *some_ptr; 
} 

struct foo *start_address(void *some_other_ptr) { 
    return ((struct test *)((char *) linkfield_ptr //Don't know what to do here); 
} 

int main() { 
    struct foo fum; 
    struct foo *foo_ptr; 

    foo_ptr = start_address(&fum.some_ptr); 
} 

foo_ptr需要是结构的起始地址,所以基本上start_address方法必须返回该地址。我一直抨击我的头反对这个问题一个小时左右,因为我不允许使用任何宏或外部库来找到答案。对此的回答以及他们如何从指针大师那里得到答案的解释将不胜感激。获取结构开始的起始地址

+0

不是fum = fum = fum的地址的起始地址吗? –

+0

C11草案标准'6.3.2.3指针,第7节[...]当一个对象的指针转换为指向字符类型的指针时,结果指向该对象的最低寻址字节。 – EOF

+0

必须使用struct中的元素才能为start_address方法派生return语句,因此需要调用start_address(&fum.some_ptr)。 @EOF - 必须是C90:p –

回答

1

如果void* some_ptr是结构的第一个字段,那么它是平凡的地址。

否则一个通用的解决方案是类似于offsetof实施,是这样的:

unsigned int offset = &((struct foo*)0)->some_ptr; 

complete example

#include <stdio.h> 
#include <stdint.h> 

struct foo 
{ 
    int padding1; 
    unsigned char padding3; 
    void* ptr; 
    int padding2; 
}; 

struct foo* start_address(void* ptr) 
{ 
    uintptr_t offset = (uintptr_t)&((struct foo*)0)->ptr; 
    return (struct foo*)(ptr - offset); 
} 

int main(void) { 
    struct foo test; 
    printf("%p == %p\n", &test, start_address(&test.ptr)); 
    return 0; 
} 

这是很容易想到,你投地址0要考虑那么struct foo*的地址,那么如果你试图获得该结构的任何字段的地址,你将得到偏移量(因为你从0开始)。

+0

它不是第一个字段,我忘了添加其他元素。现在添加em。 –

+0

所以应该start_address返回&((struct foo *)0) - > some_ptr; ?可以使用* some_other_ptr变量以某种方式得到正确的答案? –

+0

感谢杰克的完整示例。现在我明白你的意思了。真的不相信我值得这个问题,但哦。 –