When you pass an argument to a function, the function always works on a copy of that argument.
So in your case load_lines working on a copy of _array . The original _array does not change:
char** _array = NULL; printf("%p\n", _array); // Prints "0x0000" line_number = load_lines(inname, _array); printf("%p\n", _array); // Prints "0x0000"
To change _array , you need to pass a pointer to it:
int load_lines(char* _file, char*** _array){ ... (*array) = malloc (line_number * sizeof(char*)); ... (*array)[line_number] = malloc(strlen(line_buffer) + 1); } char** _array = NULL; line_number = load_lines(inname, &_array);
[However, anytime you need a triple pointer (ie *** ), it's time to rethink your architecture.]
source share