realloc() invalid old size

c, dynamic-memory-allocation, realloc

Solution

`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);

Problem

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. Here is what I have written (partially, some part is taken from the book directly):- ``` #include <stdio.h> #include <stdlib.h> int MAXLINE = 10; int INCREMENT = 10; void copy(char longest[], char line[]){ int i=0; while((longest[i] = line[i]) != '\0'){ ++i; } } int _getline(char s[]){ int i,c; for(i=0; ((c=getchar())!=EOF && c!='\n'); i++){ if(i == MAXLINE - 1){ s = (char*)realloc(s,MAXLINE + INCREMENT); if(s == NULL){ printf("%s","Unable to allocate memory"); // goto ADDNULL; exit(1); } MAXLINE = MAXLINE + INCREMENT; } s[i] = c; } if(c == '\n'){ s[i] = c; ++i; } ADDNULL: s[i]= '\0'; return i; } int main(){ int max=0, len; char line[MAXLINE], longest[MAXLINE]; while((len = _getline(line)) > 0){ printf("%d", MAXLINE); if(len > max){ max = len; copy(longest, line); } } if(max>0){ printf("%s",longest); } return 0; } ``` The moment I input more than 10 characters in a line, the program crashes and displays:- ``` *** Error in `./a.out': realloc(): invalid old size: 0x00007fff26502ed0 *** ======= Backtrace: ========= /lib64/libc.so.6[0x3d6a07bbe7] /lib64/libc.so.6[0x3d6a07f177] /lib64/libc.so.6(realloc+0xd2)[0x3d6a0805a2] ./a.out[0x400697] ./a.out[0x40083c] /lib64/libc.so.6(__libc_start_main+0xf5)[0x3d6a021b45] ./a.out[0x400549] ``` I also checked realloc invalid old size but could not follow the logic of passing a pointer to a pointer to the function modifying the array.

Original source

Related problems