2

構造体から別の構造体に値を割り当てるにはどうすればよいですか。これが私のコードです。

私はやりたくない構造体のアドレスを割り当てていると思います。「temp」の値を「a」に割り当てたい。助けが必要なセクションにコメントしました。ありがとう

また、トピック外..行ごとに自分自身をインデントせずにコードを投稿するにはどうすればよいですか?

#include <stdio.h>
#include <stdlib.h>

#define SIZE 10

typedef struct dynArrStruct
{
    double value1;
    int value2;
    int value3;
}dynArr;


void init(dynArr* a)
{
    dynArr temp;
    temp.value1 = (double)(rand()) * rand() / rand();
    temp.value2 = rand()%100;
    temp.value3 = rand()%1000;
    printf("In init(): value1: %14.5f, value2: %6d, value3: %6d\n",
            temp.value1, temp.value2, temp.value3);
    a = &temp;  // THIS LINE
}


int main(int argc, char** argv)
{
    int i;
    dynArr a1[SIZE];
    dynArr* a2[SIZE];

    for(i = 0; i < SIZE; i++)
    {
        init(&(a1[i]));
        init(a2[i]);
    }
    return 0;
}
4

2 に答える 2

4

割り当てを使用します(a有効なメモリを指していると仮定します):

*a = temp;

のメンバーはstructポインタではないため、これが機能することに注意してください。メンバーポインタを含むにこの手法(またはmemcpy())を使用するstructと、両方structのメンバーが同じアドレスを指すようになり、危険な場合があります(ダングリングポインタが発生する可能性があります)。にポインタが含まれている場合はstruct、のディープコピーstructが必要です(メンバーポインタにメモリを割り当て、ソース構造体のオブジェクトを指すものを宛先の割り当てられたメモリにコピーしますstruct)。

また、この場合tempは不要であり、のメンバーに直接値を割り当てるだけですa

于 2013-02-19T15:13:10.290 に答える
1
void init(dynArr* a)
{
    dynArr temp;
    temp.value1 = (double)(rand()) * rand() / rand();
    temp.value2 = rand()%100;
    temp.value3 = rand()%1000;
    printf("In init(): value1: %14.5f, value2: %6d, value3: %6d\n",
            temp.value1, temp.value2, temp.value3);
    a = &temp;  // THIS LINE
}

temp自動保存期間を持つローカル変数です。戻ると存在しなくなりinitます。

幸いなことに、aポイントするように作成されたポインターtempも存在しなくなるinitため、プログラムにダングリングポインターを作成することはありません。

structsは割り当て可能であるため、引数が有効なメモリを指している場合は、次のコマンドでポインティを初期化できます。

*a = temp;

それは大丈夫でしょう

init(&(a1[i]));

&a1[i]割り当てられたメモリを指しますが、

init(a2[i]);

a2[i]は初期化されていないポインタなので。

にメモリを割り当てたい場合はinit、を渡すdynArr**必要がありますが、最初のケースではそれを使用できません。したがって、2番目のケースa2[i]を呼び出す前に、にメモリを割り当てる必要があります。init

于 2013-02-19T15:13:36.403 に答える