2016-03-20 25 views
-1

回答を検索しましたが、それを検索できませんでした。動的に割り当てられた構造体を再割り当て

私は動的に割り当てられた構造体を持っています。つまり、構造体自体とそのメンバーの一部が割り当てられます。同様:

typedef struct dataUse 
{ 
    char *num; 
    char *name; 
    char *position; 
    char *eMail; 
    float upload; 
    float download; 
} DataUse; 

DataUse *ptr = NULL; 

今私は*ptrのためのメモリを再割り当てする機能を有し、またため​​、*position*eMailname,positionおよびeMailのサイズはもちろん変わります。

データの元のアドレスを保持してメモリのサイズを増やすか、同じ領域に割り当てることができない場合は、内容をコピーしてポインタに新しいアドレスを割り当てます。私の場合は今

、私は私のstruct*ptr)を再配分し、​​に何が起こるか、私の構造体の内容がコピーされ、新しいアドレスが署名されますつまり、そのサイズと後者が起こるを増やしたい場合は、*position*emailptr->num経由で古いコンテンツにアクセスできますか?何らかの記憶喪失がありますか?

私は誰かが何が起きるかを検証して、構造全体をreallocすればメモリ内にどのように見えるのかを知りたいと思います。私は見て、どのようにstructsのようなメモリのように見える私は1トンの記事を読んだが、時にはそれはいくつかのポインタを追加し、深いレベル(例のためにダブルポインタを使用して)後に少し混乱するでしょう。

そして、私はダブルポインターを使用すると、何が起こるでしょうか?**ptr2ポインタを保持して構造体を指すようにしてから、さらに多くのポインタを保持するために**ptr2を再割り当てしますか?

+1

何ですか? '私は私の構造体を再配置する場合' - あなたの構造体は固定サイズです! –

+0

「メモリ内でどのように見えるか」と尋ねるときはいつでも、これを実行しているプラ​​ットフォーム上でデバッガを起動させるための肋骨のしっかりとしたジャブと考えてください。 *記憶を見て*。どのように実際に "外見"が他のどこよりも優れていることが実証されています。 – WhozCraig

+0

@ Martins James-私の構造体は固定されていません。私は私の構造体にメモリを追加する関数を持っています: 'void allocStruct(DataUse ** ptr){ここにメモリを割り当てる}'。 – Name

答えて

1

質問が正しく理解されている場合は、DataUseのインスタンスを割り当てて、ptrに保存してください。今すぐあなたはそれを再配分しています。

ポインタは絶対アドレスを格納するので、ポインタを含む構造体を再割り当てしてもデータは失われません。

したがって、DataUseのインスタンスは、メモリのどこかにあり、そのアドレスはptrに格納されています。 numのデータは、他の場所にあり、numフィールドに格納されているアドレスはDataUseです。 DataUseのインスタンスを別の場所にコピーすると、numフィールドもコピーされるため、文字列numおよびnameなどのアドレスは変更されず、新しいコピーnum,nameフィールドに残ります。

住所を保存する場所は変更されましたが、numname ...に保持されている住所は変更されません。つまり、構造体を再割り当てするだけです。

+0

"しかし、..." um "のアドレスは、" * in * in ... "がかなり正確です。これらのメンバーのアドレス*は、それらを含む構造体のアドレスを変更するとすぐに変更されます。 – WhozCraig

+0

@songzimingはい。より多くの構造体を格納するために* ptrを割り当てる必要があります。だから私が正しく理解する場合、私の構造体がコピーされ、メモリが追加された場合、私は以前に格納された構造体にアクセスすることができますし、メンバーはthroug * ptrですか? – Name

0

我々はptr[i]が有効であると仮定した場合(例えば、以前malloc()を使用して割り当てられている少なくともi+1DataUseの配列)、およびrealloc()を使用してptrポイントが増加するためにそのメモリのサイズ、そしてptr[i].numのアドレスがあれば変更されますptrが変更されましたが、ptr[i].numの値は変更されません。あなたの構造のため

DataUse *ptr= malloc(sizeof(DataUse)); // allocate non-zeroed memory 

上記の割り当てメモリ:

0

は、次のスニペットを考えてみましょう。それはゼロにされていないので、ゼロにする必要があるものはゼロでなければならないことに注意してください。

ptr->name= malloc(strlen(this_name)+1); 
strcpy(ptr->name, this_name); 

上記は、nameを初期化します。

free(ptr_name); 
ptr->name= malloc(strlen(new_name)+1); 
strcpy(ptr->name, new_name); 

上記は、nameに新しい名前を付けます。まず、割り当てられたメモリを解放します。

char *tmpname= realloc(ptr->name, strlen(new_name)+1); 
if (tmpname) { 
    ptr->name= tmpname; 
    strcpy(ptr->name, new_name); 
} 
else printf("Out of memory); 

上記は(ほぼ)同じですが、reallocを使用しています。前に使用されていなければ、ptr->nameはゼロでなければならないことに注意してください。

関連する問題