This question is a continuation of Malloc call crashing, but works elsewhere
I tried the following program and I found it working (i.e. not crashing - and this was mentioned in the above mentioned link too). I May be lucky to have it working but I'm looking for a reasonable explanation from the SO experts on why this is working?!
Here are some basic understanding on allocation of memory using malloc() w.r.t structures and pointers
malloc(sizeof(struct a) * n)allocatesnnumber of typestruct aelements. And, this memory location can be stored and accessed using apointer-to-type-"struct a". Basically astruct a *.malloc(sizeof(struct a *) * n)allocatesnnumber of typestruct a *elements. Each element can then point to elements of typestruct a. Basicallymalloc(sizeof(struct a *) * n)allocates anarray(n-elements)-of-pointers-to-type-"struct a". And, the allocated memory location can be stored and accessed using apointer-to-(pointer-to-"struct a"). Basically astruct a **.
So when we create an array(n-elements)-of-pointers-to-type-"struct a", is it
- valid to assign that to
struct a *instead ofstruct a **? - valid to access/de-reference the allocated
array(n-elements)-of-pointers-to-type-"struct a"usingpointer-to-"struct a"?
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
The code snippet is as follows:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
typedef struct {
int value1;
int value2;
}data;
int n = 1000;
int i;
int val=0;
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
printf("allocation successful\n");
for (i=0 ; i<n ; i++) {
array[i].value1 = val++;
array[i].value2 = val++;
}
for (i=0 ; i<n ; i++) {
printf("%3d %3d %3d\n", i, array[i].value1, array[i].value2);
}
free(array);
printf("freeing successful\n");
return 0;
}
EDIT: OK say if I do the following by mistake
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
Is there a way to capture (during compile-time using any GCC flags) these kind of unintended programming typo's which could work at times and might blow out anytime! I compiled this using -Wall and found no warnings!