2015-06-10 170 views
3

我正在偏移我的指針,如下面的代碼所示,以便複製到另一個結構。將指針移動到所需位置

#include <stdio.h> 

struct a 
{ 
    int i; 
}; 
struct test 
{ 
    struct a *p; 
    int x,y,z; 
}; 

int main() 
{ 
    struct test *ptr = malloc(sizeof(struct test)); 
    struct test *q = malloc(sizeof(struct test)); 
    ptr->x = 10; 
    ptr->y = 20; 
    ptr->z = 30; 
    memcpy(&(q->x),&(ptr->x),sizeof(struct test)-sizeof(struct a*)); 

    printf("%d %d %d\n",q->x,q->y,q->z); 
    return 0; 
} 

有沒有更好的方法來做我的memcpy()? 我的問題是如果我認識到結構的成員,並且只想移動我的指針sizeof(struct a*)並複製結構的其餘部分?

編輯:

我想複製結構的某些部分,但我不知道它的成員,但我知道我要跳過一些類型的變量作爲示例所示(結構A * )並複製結構的其餘部分。

+4

的問題不是很清楚你是通過結構遍歷意味着複製? –

+0

@GinuJacob是的..我的意思是我想複製一些基於 – Gopi

+1

類型的結構部分不清楚的問題。你的意思是你想複製struct的所有成員,除了'p'? – Peter

回答

5

使用offsetof(struct test, x)(C99,gcc),而不是sizeof(stuct a *)。由於填充/對齊,它們不能保證是平等的。 注意:作爲填充的結果,使用sizeof(..)可能導致未定義的行爲,因爲複製了太多的字符。

offsetof(<type>, <member>)返回從開始的偏移量。因此,sizef(struct test) - offsetof(struct test, x)產生char s的數量以複製所有字段,從x開始。

Just read here for more details

+0

感謝您的輸入 – Gopi

+0

@Gopi:我增加了另一個方面,它使您的解決方案變得危險。 – Olaf

4

我認爲最好的辦法是使用offsetof

memcpy(&(q->x),&(ptr->x),sizeof(struct test)-offsetof(struct test, x)); 

因爲如果第一個元素是有一點不同,你可以有對齊問題,而offsetof照顧對準你。

當然,不應該發生在通用架構上的指針alignement的問題,但我認爲offsetof是更好的做法,反正

+0

@alk:post編輯 –

+0

感謝您建議'offesetof()'.. – Gopi