Below is the sample code for populating the array of struct R using double pointers. I am unable to allocate memory to r[0] and also when the function exits, both r and r[0] becomes 0x0.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct R
{
int x;
int y;
char * z;
};
void func(struct R **r)
{
r = (struct R **) malloc(4 * sizeof(struct R *));
r[0] = (struct R *) malloc(sizeof(struct R)); // giving r[0] = 0x0
r[0]->x = 1;
r[0]->y = 2;
r[0]->z = (char *) malloc(64 * sizeof(char));
strcpy(r[0]->z , "HELLO");
}
int main()
{
struct R *r = NULL;
func(&r);
printf("%d", r->x);
printf("%d", r->y);
printf("%s", r->z);
return 0;
}
I am unable to find the reason behind it. Any help would be highly appreciated.
The line
r = (struct R **) malloc(4 * sizeof(struct R *));
changes where r points but only locally in the function. It does not change the value of the pointer in the calling function.
What you need is:
void func(struct R **r)
{
*r = malloc(sizeof(struct R));
r[0]->x = 1;
r[0]->y = 2;
r[0]->z = malloc(64 * sizeof(char));
strcpy(r[0]->z , "HELLO");
}
Another option is to change the return value of func to a pointer and make it simpler to use.
struct R * func()
{
struct R *r = malloc(sizeof(*r));
r->x = 1;
r->y = 2;
r->z = malloc(64 * sizeof(char));
strcpy(r->z , "HELLO");
return r;
}
and use it in main as:
struct R *r = func();
PS See Do I cast the result of malloc? to understand why you should not cast the return value of malloc.
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