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)
allocates n
number of type struct a
elements. And, this memory location can be stored and accessed using a pointer-to-type-"struct a"
. Basically a struct a *
.
malloc(sizeof(struct a *) * n)
allocates n
number of type struct a *
elements. Each element can then point to elements of type struct a
. Basically malloc(sizeof(struct a *) * n)
allocates an array(n-elements)-of-pointers-to-type-"struct a"
. And, the allocated memory location can be stored and accessed using a pointer-to-(pointer-to-"struct a")
. Basically a struct 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 of struct a **
?
- valid to access/de-reference the allocated
array(n-elements)-of-pointers-to-type-"struct a"
using pointer-to-"struct a"
?
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory
");
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
");
return -1;
}
printf("allocation successful
");
for (i=0 ; i<n ; i++) {
array[i].value1 = val++;
array[i].value2 = val++;
}
for (i=0 ; i<n ; i++) {
printf("%3d %3d %3d
", i, array[i].value1, array[i].value2);
}
free(array);
printf("freeing successful
");
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!
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…