2016-10-09 630 views
5

我以爲我讀的地方,使用指針,我們希望有兩個選項之一的另一個內容複製時:複製一個指針的內容到另一個

  • 使用的memcpy或
  • 剛用=來分配它們?

然而,在下面的例子中,我只是對兩個指針分配內存,然後分配第二,first..but改變然後我的第二個指針的入口也在發生着變化。什麼我做錯了測試它:/。

typedef struct { 

    int a; 
    int b; 
    int c; 
} my_struct; 


int main(int argc, char** argv) { 

    my_struct* first = malloc(sizeof(my_struct)); 
    first->a = 100; first->b = 101; first->c = 1000; 

    my_struct* bb = malloc(sizeof(my_struct)); 

    printf("first %d %d %d\n", first->a, first->b, first->c); 
    bb = first; 
    printf("second %d %d %d\n", bb->a, first->b, bb->c); 


    first->a = 55; first->b = 55; first->c = 89; 
    printf("second %d %d %d\n", bb->a, first->b, bb->c); 
} 
+1

@MDXF:我看不到'strdup()'是如何遠程相關的。如果評論可能被低估,我會對該建議進行投票。 –

回答

7

你做bb = first;bbfirst的那一刻都指向相同的內存位置。 first->a = 55; first->b = 55; first->c = 89;將更改該位置中的a,bc的值。原始值first,仍然在內存中徘徊,但無法再訪問它。

我想你可能想要做的是*bb = *first;

+0

好的非常感謝你的解釋,它使得它更清晰一點.. 但是關於做內容複製的C約定是什麼,memcpy更常見,或者你寫的任務? – malajedala

+0

我不認爲每個會議都有一個會議。它真的取決於這種情況,因爲複製涉及指針的數據是相當先進的主題,IMO。 – Anzurio

2

你的知識約memcpy是正確的,但你不能「通過指針指向的位置」只是像你上面提到你的聲明沒有分配指針指定的內容。

您在下面的語句中給一個指向另一:

bb = first; 

現在這些都指向同一個內存位置(認爲bb作爲別名first)。

如果你想,那麼你使用複製來複制數據「數據的指針指出,」 *bb = *first

+0

好的,所以在這些情況下沒有辦法使用memcpy? – malajedala

+1

@malajedala'* bb = * first;' – potrzebie

1

正如已經指出的那樣,如果你有一個指針first指向內存中的某個位置,你進行分配bb = first,其中bb是兼容的指針類型,然後bb指向相同的地址first。這不會將first引用的內存內容複製到bb最初引用的位置。它將指針的值(地址)複製到bb

如果您定義的數組爲A,則無法將分配B = AA的內容複製到B。您必須使用strcpy()memcpy()或某些此類功能。但結構是不同的。您可以將一個結構的內容分配給兼容的結構。

在你的榜樣,bbfirst是指向結構,當你寫bb = first,現在兩個指針引用的內存地址相同,並且你不再有機會獲得最初由bb引用的內存 - 所以現在你有內存泄漏!但是*bb*first是結構體,並且當您編寫*bb = *first時,結構體*first的內容被複制到結構體*bb。所以現在你有兩個不同的結構,分別在不同的內存位置,每個都有相同的三個副本。

如果您my_struct類型包含一個指向int,然後分配*bb = *first後,他們將各自包含一個指針的一個拷貝到相同的位置在內存中,但這些指針引用的數據不會被複制。所以,如果結構體包含一個指向數組的指針,那麼只有指針會被複制,而不是數組的內容,這將被兩個結構體共享。

相關問題