如何将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;
}
答案 0 :(得分:3)
使用赋值(假设a
指向有效内存):
*a = temp;
注意这是有效的,因为struct
的成员不是指针。在包含成员指针的memcpy()
上使用此技术(或struct
)将导致struct
成员指向同一地址,这可能是危险的(可能导致指针悬空) )。如果struct
包含指针,则需要struct
的深层副本(为成员指针分配内存并将源结构中指向的对象复制到目标{{1}中的已分配内存中})。
此外,在这种情况下,struct
是多余的,您只需将值直接分配给temp
的成员。
答案 1 :(得分: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
不会为您的程序创建悬空指针。
struct
是可分配的,所以如果参数指向有效内存,你可以用
*a = temp;
这对
来说没问题init(&(a1[i]));
因为&a1[i]
指向分配的内存,而不是
init(a2[i]);
因为a2[i]
是未初始化的指针。
如果您想在init
中分配内存,则必须传递dynArr**
,但是在第一种情况下您无法使用它。因此,在为第二种情况调用a2[i]
之前,您应该将内存分配给init
。