I am doing an exercise for fun from KandR C programming book. The program is for finding the longest line from a set of lines entered by the user and then prints it.
Her
You are trying to realloc()
memory that was not allocated dynamically with malloc()
. You cannot do that.
Also, if realloc()
fails, the original memory is still allocated, and thus still needs to be freed with free()
. So do not assign the return value of realloc()
to the original pointer unless it is not NULL, otherwise you are leaking the original memory. Assign the return value of realloc()
to a temp variable first, check its value, and then assign to the original pointer only if realloc()
was successful.
realloc
call will re-allocate memory by taking a pointer to a storage area on the heap
i.e a dynamically allocated memory result of a call to malloc
.
In your case the problem is that you are allocating memory on the stack
and not dynamically by a call to malloc
which results memory allocation on the heap
. And, passing the pointer of the automatic
character array line
to _getline
which uses it for call to realloc
. So, you got the error.
Try dynamically allocating the character array line
:
char* line = (char *) malloc(MAXLINE);
char* longest = ( char *) malloc(MAXLINE);
You get an invalid old size
error when your code writes the memory that malloc
/realloc
allocated for "housekeeping information". This is where they store the "old" allocated size. This also happens when the pointer that you pass to realloc
has not been properly initialized, i.e. it's neither a NULL
nor a pointer previously returned from malloc
/calloc
/realloc
.
In your case, the pointer passed to realloc
is actually an array allocated in automatic memory - i.e. it's not a valid pointer. To fix, change the declarations of line
and longest
as follows:
char *line = malloc(MAXLINE), *longest = malloc(MAXLINE);
To avoid memory leaks, make sure that you call free(line)
and free(longest)
at the end of your program.
if _getline()
reads 10 or more characters, it will call realloc()
on memory that was not allocated with malloc()
. This is undefined behavior.
Additionally, the memory allocated from realloc()
will be leaked at the end of the call to _getline()
.
Additionally, let's assume that the input string is "0123456789\n"
. Then you will attempt to write to longest
that value, but you will never call realloc()
before you do that, which is required.
Your error is here:
int _getline(char s[])
It means _getline
is a function returning int
getting a pointer to char
by value.
You actually want to pass that pointer (which must point to memory allocated with malloc()
or be NULL
) by reference.
That means, you need to pass a pointer to a pointer to char
.
Correcting that error will force you to correct all follow-on errors too.
Only use free
/ realloc
on NULL
resp. on pointers returned from malloc
, calloc
, realloc
or a function specified to return such a pointer.