I was struggling to fix a code today, then I come across something similar to:
typedef struct {
int a;
int b;
int c;
int d;
char* word;
} mystruct;
int main(int argc, char **argv){
mystruct* structptr = malloc(sizeof(mystruct));
if (structptr==NULL) {
printf("ERROR!")
...
}
...
free(structptr);
return 0;
}
the code was giving lots of memory errors due to the fact, that char* word
is a string of variable length, and malloc was not allocating enough memory for it. In fact it was only allocating 20 Bytes
for the whole struct
. Is there a way around this issue, without turning the char*
into sth like char word[50]
?
You are allocating only memory for the structure itself. This includes the pointer to char, which is only 4 bytes on 32bit system, because it is part of the structure. It does NOT include memory for an unknown length of string, so if you want to have a string, you must manually allocate memory for that as well. If you are just copying a string, you can use
strdup()
which allocates and copies the string. You must still free the memory yourself though.If you don't want to allocate memory for the string yourself, your only choice is to declare a fixed length array in your struct. Then it will be part of the structure, and
sizeof(mystruct)
will include it. If this is applicable or not, depends on your design though.malloc the outer struct will only allocate 1 byte memory pointed by
*word
since it is a 'char *' type. If you want to allocate more than 1 byte of memory pointed byword
, there are 2 options:char word[50]
instead of `char *'word
as well. Remember to callfree
twice as well in this case.Add a second
malloc
for whatever length (N) you need forword
Use
word=malloc(128);
this will allocate 128 bytes to your varible word,
When you allocate memory for
structptr
, the pointerword
in thestruct
has no valid memory to point. So you eithermalloc
a piece of memory forword
, too, or makeword
point to another character.as you can read here you need to allocate the
char *
separately :