2016-06-21 6 views
-3

私は2つの構造体num1とnumを同一視しています。私がしたいのは、残りのフィールドがnumのフィールドと等しくなければならない他のフィールドを変更せずに、num1のフィールドの1つを変更することです。しかし、次のコードは、numとnum1の両方のフィールドを変更することになります。誰か理由を教えてもらえますか?2つの構造体を似ているが、フィールドの1つを変更したい

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    typedef struct 
    { 
     int one; 
     int two; 
    }Num; 

    Num *num; 
    Num *num1; 
    num=malloc(sizeof(Num)); 
    num->one=1; 
    num->two=2; 
    // num1=malloc(sizeof(Num)); 
    num1=num; 
    num1->one=10; 
    //num1->two=2; 

    printf("%d %d\n",num1->one,num->one); 
    return 0; 
} 

私は別の方法を知っています。 num1のメモリを割り当てます。 numのすべてのフィールドをnum1に等しくして、変更したいフィールドを除いてください。他の方法はありますか?

+0

「2つの構造体を」。あなたは2つの構造体を持っていません。あなたは同じ構造体への2つのポインタを持っています。 – kaylum

+0

'num'と' num1'の両方がポインタであることはご存知でしょうか? –

+0

はい、私はそれらが構造体へのポインタであることを知っています。 num1のフィールドを変更するために言及した方法以外の方法はありますか? @Sourav –

答えて

2

は、次の2つのポインタnumnum1を持っている(彼らは同じものを指しているので)もnum1が指す構造体を変更しますnumを経由して構造体を変える同じstructure.Soにどのポイント。

num = malloc(sizeof(Num)); 
num1 = malloc(sizeof(Num)); 

numと異なる構造体へのnum1ポイント。

num->one=1; 
num->two=2; 
*num1 = *num; 
num1->two = 3; 
+0

クール!ありがとう@Gaurav –

+0

このコードに従うと、メモリリークが発生します。 – Lundin

+0

@Lundinあなたは詳細を教えてください。 –

0

num1のメモリを作成していません。変数numのエイリアスを作成しています。 mallocまたは他のメモリ割り当て関数を使用しないと、特定の構造またはオブジェクトのディープコピーまたはクローンを期待できません。これを試して。

num1=malloc(sizeof(Num)); 
memcpy (num1, num, sizeof (num1)); 

機能memcpyは、あなたがそれに別々の値を持つように各numとNUM1のための独立したメモリを割り当てる必要が

memcpy(destination_var, source_var, sizeof (destination_var)); 
+0

私はmemcpyが深いコピーをしているとは思わない(この場合もあります)。もしnumがポインタを含んでいたら? @ sameera –

+0

@ ArunSrikanthSridhar変数の中に値がある場合、深いコピーが優先されます。彼は値としてのポインタを持っていないので、それを行うオプションを彼に与えました。ポインタを持っていればクローンメソッドを自分で書く必要があります –

0

以下の通りであるあなたがmemcpyの深いcopies.Theフォーマットを作り、変数のクローンを作成するのに役立ちます。 は、malloc関数を避けるためには、単に以下のように変数を宣言し

Num num; 
Num num1; 

num.one=1; 
num.two=2; 

num1=num; 
num1.one=10; 
//num1.two=2; 
0

すべてがこれまで言っ忘れて、次のように行ってくださいコードを試してみてください。

num=malloc(sizeof(Num)); 
num1=malloc(sizeof(Num)); 

num->one=1; 
num->two=2; 

*num1 = *num; // copy all of the contents 

num1->one=10; // change individual members if needed 

... 
free(num); 
free(num1); 
+0

構造体にポインタまたは動的に割り当てられた配列が含まれている場合は、これが機能しますか(* num1 = * num)? @ランディン。ありがとう –

+0

@ArunSrikanthSridharいいえ、その場合は詳細コピーを取得しません。あなたは指差しデータのコピーにメモリを割り当て、すべてのポインタを調整する必要があります。 – Lundin

関連する問題