I’m C# man, new in C language working with points first time.
I have this function that works with malloc(), realloc() and free() at future:
char ** split(char * delimiter, char * input) {
int i = 0;
int size = sizeof(char *);
char ** tokens;
char * token;
char * state;
tokens = (char **) malloc(size);
if(tokens == NULL) {
printf("Allocation failed.");
return;
}
for(token = strtok_r(input, delimiter, &state);
token != NULL;
token = strtok_r(NULL, delimiter, &state),
i++, size *= i) {
tokens = (char **) realloc(tokens, size);
if(tokens == NULL) {
printf("Realloc failed.");
return;
}
tokens[i] = state;
}
return tokens;
}
when I call:
char * IPNumber = "127.0.01";
char * delimiter = ".";
char ** parts = split(delimiter, IPNumber);
it gives segmentation fault.
I’m looking for an explanation how to get(calculate) the size value to be used in the second argument of realloc() function. Thanks in advance.
Complete rewrite. There are some issues with the original code as posted.
So rather than attempt to describe the changes, I’ll follow the same pattern as others and show what might be a cleaner implementation with a single allocation based on the max possible number of tokens.
Usage might look like the following. Note the use of
strdupto avoid passing the string constant to the function: