2013-06-05 98 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'來說可以很好地工作,但是會導致他的電腦在其他任何事情上爆炸。有時候答案必須解決更多的問題。 –