2013-06-05 48 views
1

所以,我有一个结构如果已知偏移量,如何获得结构的成员?

struct foo 
{ 
    int a; 
    int b; 
    int c; 
    char *string; 
}; 
typedef struct foo foo; 

而且我有一个函数

void fun(void *data1, void *data2, int offset){ 
    int num1 = *(int *)(data1 + offset); 
    int num2 = *(int *)(data2 + offset); 
    printf("%d %d\n", num1, num2); 
} 

而且它的伟大工程。但是当我尝试用字符串做同样的事情时,有些东西是错误的。

void fun(void *data1, void *data2, int offset){ 
    char *str1 = (char *)(data1 + offset); 
    char *str2 = (char *)(data2 + offset); 
    printf("%s %s\n", str1, str2); 
} 

功能只是打印一些随机字符。我开始拿到,因为指针的头痛...

+0

你是如何调用'乐趣()'? – shf301

+3

用'void'指针做算术是一个扩展。 –

+0

顺便说一句,你本来自己,如果你与胶印印刷以及你的'foo'实例的基地址,然后有'fun'打印功能,它试图访问(提示的地址整理了这一点:使用'%用'printf'和朋友打印指针]。 –

回答

7

地址+一个char *的偏移量是一个指针到 - char *,换句话说,它是一个char **(就像在你工作的一部分,该地址+一个int的偏移是指针到 - int,即它是一个int *)。

这样的定义和aceess需要在类型的额外的间接的,即char **

char *str1 = *(char **)(data1 + offset); 
+1

您正确地解决了潜在的问题。但是当你给'void *'添加一个'offset'时你会得到什么?谁知道......这是不确定的行为,这很糟糕。它应该看起来更像这样:'char * str1 = *(char **)((unsigned char *)data1 + offset);' –

+0

这是一个不同的故事。既然它在他的int样本中工作,我想有一个C扩展可以做到这一点(这不是他的问题的一部分,所以我不想混淆可怜的人)。 – Nicholaz

+0

的确如此,但你仍应该为他指出这一点,并解释他如何正确地做到这一点。对于你所知道的这个“C扩展”对于'int'来说可以很好地工作,但是会导致他的电脑在其他任何事情上爆炸。有时候答案必须解决更多的问题。 –