Я занимаюсь раздражающей ошибкой повреждения памяти в течение нескольких часов. Я проверил каждый связанный поток здесь, и я не смог его исправить.malloc(): повреждение памяти в странном месте
Прежде всего, я пишу простой терминал в C. Я разбираю команды между символами pipe (|) и redirection (>, < и т. Д.) И размещаю их в очереди. Ничего сложного!
Вот структура данных для очереди;
struct command_node {
int index;
char *next_symbol;
struct command_node *nextCommand;
int count;
char **args;
};
Когда я храню небольшие строки в указателе ** args, все работает отлично. Однако, когда один из аргументов длинный, я получаю malloc(): ошибка повреждения памяти. Например, следующая первая команда работает отлично, вторая команда вызывает ошибку
1st: ls -laF some_folder | wc -l
2nd: ls -laF /home/enesanbar/Application | wc -l
я запускаю отладчик, он показал, что таНос() вызов для нового узла в очереди вызывает ошибку.
newPtr = malloc(sizeof(CommandNode));
Я тщательно выделить массив строк и освобождение после я сделал с ними следующим образом:
char **temp = NULL;
temp = malloc(sizeof(char*) * number_of_args);
/* loop through the argument array */
for (i = 0; i < number_of_args; i++) {
/* ignore the remaining commands after ampersand */
if (strcmp(args[i], "&") == 0) return;
/* split commands by the redirection or pipe symbol */
if (!isSymbol(args[i])) {
temp[count] = malloc(sizeof(strlen(args[i])) + 1);
strcpy(temp[count], args[i]);
count++;
/* if it is the last argument, assign NULL to the symbol in the data structure */
if (i + 1 == number_of_args) {
insertIntoCommands(&headCommand, &tailCommand, temp, NULL, count);
for (j = 0; j < count; j++) free(temp[j]);
count = 0; // reset the counter
}
}
else {
insertIntoCommands(&headCommand, &tailCommand, temp, args[i], count);
for (j = 0; j < count; j++) free(temp[j]);
count = 0; // reset the counter
}
}
Должно быть, я что-то пропустил, или есть что-то я не знаю, о поля args и распределение нового узла, хотя я ничего не делал раньше.
'темп [число]' <- что 'count'? –
, чтобы отслеживать, где поставить следующий аргумент, и я также сохраняю его для удобства при печати материала для отладки. – enesanbar
'sizeof (strlen (...' вероятно, не то, что вы хотите). Drop sizeof – Art