Select array of strings from inside function in C

I have a function that scans a file and returns the number of lines along with the lines in an array of strings, my function looks like this:

int load_lines(char* _file, char** _array){ FILE *infile; char line_buffer[BUFSIZ]; char line_number; infile = fopen(_file, "r"); ine_number = 0; while (fgets(line_buffer, sizeof(line_buffer), infile)) ++line_number; fclose(infile); _array = malloc (line_number * sizeof(char*)); infile = fopen(_file, "r"); line_number = 0; while (fgets(line_buffer, sizeof(line_buffer), infile)) { _array[line_number] = malloc(strlen(line_buffer) + 1); strcpy(_array[line_number], line_buffer); //a printf on _array[line_number] works fine here ++line_number; } return line_number; } 

When I call it this way:

 char** _array; line_number = load_lines(inname, _array); _array[0]; 

I get a segmentation error because the array does not seem to be allocated after the function returns.

+4
source share
2 answers

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.]

+6
source

If you want to return a newly allocated array of strings from a function, then the second argument of the function must be of type char*** , for example. 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); 
+1
source

All Articles