I have a function that scans a file and returns the number of the lines along with the lines in a string array, my function looks like this :
int load_lines(
When you pass an argument into a function, the function always works on a copy of that argument.
So in your case, load_lines
is working on a copy of _array
. The original _array
is not modified:
char** _array = NULL;
printf("%p\n", _array); // Prints "0x0000"
line_number = load_lines(inname, _array);
printf("%p\n", _array); // Prints "0x0000"
To modify _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, any time you find yourself needing a triple pointer (i.e. ***
), it's time to reconsider your architecture.]
If you want to return a newly allocated array of strings from the function, then the second argument of the function must have a type of char***
, eg. a pointer to an array of strings:
int load_lines(char* _file, char*** _array) {
...
char** tmparray = malloc(line_number * sizeof(char*));
...
tmparray[line_number] = malloc(strlen(line_buffer) + 1);
strcpy(tmparray[line_number], line_buffer);
...
(*_array) = tmparray;
}
And when you call the function:
char** _array;
line_number = load_hosts(inname, &_array);