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不是指针。在包含成员指针的 a 上使用这种技术(或memcpy()struct会导致两个structs 的成员都指向同一个地址,这可能很危险(可能导致悬空指针)。如果 astruct包含指针,则需要 的深拷贝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回来后就不复存在了。

幸运的是,指向的指针atemp不再存在,因此init不会为您的程序创建悬空指针。

structs 是可赋值的,所以如果参数指向有效内存,你可以用初始化指针

*a = temp;

那没关系

init(&(a1[i]));

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

init(a2[i]);

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

如果要在 中分配内存init,则必须传递 a dynArr**,但不能在第一种情况下使用它。所以你应该a2[i]在调用init第二种情况之前分配内存。

于 2013-02-19T15:13:36.403 回答