Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why am I getting an invalid pointer error when I try to free malloced pointers?

I’m trying to learn about how arrays of strings can be created in C using malloc (i.e. dynamically sized arrays of strings).

I can get everything working but I’m getting an "invalid pointer" error when I try to free the char* pointers stored in namesArray->data[0] and namesArray->data[1]

But if I don’t use free on these two pointers, I get memory leaks.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Any idea what I’m doing wrong here? I’m stumped

#include <stdio.h>
#include <stdlib.h>

typedef char* string;

typedef struct List_Repr {
    string *data;
} *list;

// add names to the supplied string array, myList
void addNames(list *myList, int numOfNames){
    //this is the equivalent of char** i.e. array of pointer to strings
    (*myList)->data = (string*)malloc(numOfNames*sizeof(string*)); //mallocing an array of char pointers
    
    //this is the equivalent of char* i.e. the strings themselves
    (*myList)->data[0] = (string)malloc(sizeof("Raymond")+1);
    (*myList)->data[0] = "Raymond";
    (*myList)->data[1] = (string)malloc(sizeof("George")+1);
    (*myList)->data[1] = "George";
}

//prints the names in the supplied array, myList
void printNames(list *myList){
    printf("%s\n", (*myList)->data[0]);
    printf("%s\n", (*myList)->data[1]);
}

int main()
{
    
    list namesArray = (list)malloc(sizeof(list)); // mallocing the namesArray

    
    addNames(&namesArray,2);
    printNames(&namesArray);
    
    free(namesArray->data[0]); //why does this free() command give me an error?
    free(namesArray->data[1]); //why does this free() command give me an error?
    free(namesArray->data);
    free(namesArray);
    
    return 0;
}

>Solution :

(*myList)->data[0] = (string)malloc(sizeof("Raymond")+1);
(*myList)->data[0] = "Raymond";

The second assignment overwrites the malloc pointer. Which means you can’t free the original pointer anymore as it is lost. Since you don’t need to actually change the string you can just delete the first line completely and then there would be no need to free. Or if you want to be able to have a modifiable string then use strcpy((*myList)->data[0], "Raymond");

Another problem is that malloc(numOfNames*sizeof(string*)) should be malloc(numOfNames*sizeof(string)). Though in this case it won’t cause any problem as they happen to be the same size. But it should be fixed nevertheless.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading