Новичок в C и Valgrind и ручном управлении памятью, и у меня возникли проблемы с поиском ошибки, которую я получаю при запуске Valgrind. У меня есть эта функция, которая получает строки от пользователя:
char **get_fragments_from_user(){
// No more than 20k strings containing at most 1k characters
char **strings = malloc(20000 * sizeof(char *));
char tempstring[MAX_INPUT]; //MAX_INPUT = 1001
int count = 0;
while(true){
printf("\n> ");
fgets(tempstring, MAX_INPUT, stdin);
if((strlen(tempstring) > 0) && (tempstring[strlen(tempstring) - 1] == '\n')){
tempstring[strlen(tempstring) - 1] = '\0';
}
if(tempstring[0] == 'q') break;
strings[count] = malloc(sizeof(char) * (strlen(tempstring)+1));
strcpy(strings[count], tempstring);
count++;
}
int i = 0;
char **fstrings = malloc((count)*sizeof(char *)); // count+1 needed? Something I tried removing while debugging
for(i = 0; i < count; i++){
fstrings[i] = malloc(sizeof(char) * (strlen(strings[i])+1));
strcpy(fstrings[i], strings[i]);
free(strings[i]);
}
free(strings);
return fstrings;
}
Идея здесь состоит в том, чтобы просто получить строки и поместить их в массив. Сначала я выделяю массив, который достаточно велик, чтобы вместить максимальное количество строк, которые можно когда-либо ввести (20 000), но затем я изменяю размер массива, чтобы не выделять больше памяти, чем требуется для каждой строки. Я немного смущен приведенным выше кодом, так как он менее чистый, чем все, что я написал бы на другом языке, но это был мой первый проход.
Затем я получаю «Недопустимое чтение размера 8» от Valgrind, когда пытаюсь вычислить количество строк в массиве с помощью этой функции:
int lengthOf(char **arr){
int i = 0;
while(arr[i] != NULL){
i++;
}
return i;
}
Я почти уверен, что это связано с разыменованным указателем или чем-то еще, но я не могу найти его на всю жизнь, и я смотрю на этот код уже час или около того.
char **fstrings = calloc(count+1, sizeof(char *));
- person BLUEPIXY   schedule 29.08.2014return fstrings;
--››fstrings[i] = NULL;
- person wildplasser   schedule 29.08.2014