I am trying to make an array of pointers to a structure the program runs, however it just says 'Segmentation fault: 11' any help would be be very much appreciated
typedef struct
{
int id;
double x;
double y;
char name[30];
int named;
} Star;
Star *stars[10];
int bang (int n_stars)
{
if ((n_stars >= 1) && (n_stars <= 10))
{
for (int i = 0; i < n_stars; i++)
{
double x = rand() % 10;
double y = rand() % 10;
stars[i] = (Star*) malloc(sizeof(x) + sizeof(y));
stars[i]->x = x;
stars[i]->y = y;
free(stars[i]);
return 1;
}
}
else
{
return 0;
}
return 0;
}
For the sake of the argument, let us disregard struct alignment and assume a target (such as x86) where:
sizeof(double) == 8
, and sizeof(int) == 4
.
Now, you're allocating a block of memory 16 bytes in size:
stars[i] = (Star*) malloc(sizeof(x) + sizeof(y));
The definition of the struct is:
typedef struct
{
int id;
double x;
double y;
char name[30];
int named;
} Star;
Note the offset of y
is 12 bytes. When you perform:
stars[i]->y = y;
The value of y
is written to the address &stars[i]
+ 12 bytes. Double taking up 8 bytes, this will overflow your allocation (12+8 > 16), mentioned above.
You most likely want to change the allication to stars[i] = malloc(sizeof(Star));
, to allocate the proper amount of space for your struct.
EDIT: If you are planning to use the allocated data elsewhere, you should remove the call to free
, and instead free the data after you are done with it in your program. The return
statement on the following line may possibly be a mistake too, as it exits the loop on the first iteration, which is most likely not what you want.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.