How do I assign a value from struct to another. Here is my code.
I believe I am assigning the address of the struct which is what I don't want to do. I want to assign the values of "temp" to 'a'. I commented the section I need help on. Thanks
Also off-topic.. How do I post code without having to indent myself every line, line-by-line?
#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;
}
Use assignment (assuming a
is pointing to valid memory):
*a = temp;
Note this works because the members of the struct
are not pointers. Using this technique (or memcpy()
) on a struct
that contained member pointers would result in both struct
s having members pointing to the same address, which may be dangerous (possibly resulting in dangling pointers). If a struct
contains pointers then a deep copy of the struct
is required (allocating memory for the member pointers and copying the pointed to objects in the source struct to the allocated memory in the destination struct
).
Also, in this case temp
is superfluous and you just assign values directly to the members of 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
is a local variable with automatic storage duration. It ceases to exist when init
returns.
Fortunately, the pointer a
that is made to point to temp
also ceases to exist, so init
doesn't create dangling pointers for your programme.
struct
s are assignable, so if the argument points to valid memory, you can just initialise the pointee with
*a = temp;
That would be okay for
init(&(a1[i]));
since &a1[i]
points to allocated memory, but not for
init(a2[i]);
since a2[i]
is an uninitialised pointer.
If you want to allocate memory in init
, you'd have to pass a dynArr**
, but then you can't use it for the first case. So you ought to allocate memory to a2[i]
before calling init
for the second case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With