Нов в 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