繁体   English   中英

用另一个结构初始化一个结构

[英]Initializing a struct with another struct

如何将struct中的值分配给另一个。 这是我的代码。

我相信我正在分配该结构的地址,这是我不想做的。 我想将“ 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;
}

使用分配(假设a指向有效内存):

*a = temp;

请注意,这是可行的,因为该struct的成员不是指针。 在包含成员指针的struct上使用此技术(或memcpy() )将导致两个struct具有指向相同地址的成员,这可能很危险(可能导致指针悬空)。 如果一个struct包含指向则的深层副本struct是必需的(分配用于所述构件指针存储器和复制尖锐物体在源结构到目标分配的存储器struct )。

另外,在这种情况下, temp是多余的,您只需将值直接分配给a的成员。

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返回时,它不再存在。

幸运的是,指向temp的指针a也不再存在,因此init不会为程序创建悬挂的指针。

struct是可分配的,因此,如果参数指向有效内存,则可以使用

*a = temp;

这样就可以了

init(&(a1[i]));

因为&a1[i]指向分配的内存,但不是

init(a2[i]);

因为a2[i]是未初始化的指针。

如果要在init分配内存,则必须传递dynArr** ,但在第一种情况下不能使用它。 因此,您应该在为第二种情况调用init之前将内存分配给a2[i]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM