malloc(): повреждение памяти в странном месте
Я имел дело с досадной ошибкой повреждения памяти в течение нескольких часов. Я проверил все связанные темы здесь, и я не мог это исправить.
Прежде всего, я пишу простой Терминал на C. Я анализирую команды между символами канала (|) и перенаправления (>, <и т. Д.) И помещаю их в очередь. Ничего сложного!
Вот структура данных для очереди;
struct command_node {
int index;
char *next_symbol;
struct command_node *nextCommand;
int count;
char **args;
};
Когда я храню маленькие строки в указателе **args, все работает просто отлично. Однако, когда один из аргументов длинный, я получаю malloc(): ошибка повреждения памяти. Например, следующая 1-я команда работает нормально, 2-я команда вызывает ошибку
1st: ls -laF some_folder | wc -l
2nd: ls -laF /home/enesanbar/Application | wc -l
Я запускаю отладчик, он показывает, что вызов malloc () для нового узла в очереди вызывает ошибку.
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 и распределении нового узла, хотя раньше я ничего такого не делал.
1 ответ
но как обернуть число вокруг sizeof может вызвать ошибку в распределении узла? Я просто пытаюсь понять это из любопытства.
Как я уже говорил в своем комментарии, вы пытаетесь получить размер указателя внутри функции strlen, а не длину, которая предоставляется функцией.
Пожалуйста, обратите внимание на следующее:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void){
char *name = "Michi";
size_t length1, length2;
length1 = strlen(name);
length2 = sizeof strlen(name);
printf("Length1 = %zu\n",length1);
printf("Length2 = %zu\n",length2);
return 0;
}
Выход:
Length1 = 5
Length2 = 8
Еще одна вещь, после вас free(temp[j])
не забудь free(temp)
также.
Что-то вроде этого:
#include <stdio.h>
#include <stdlib.h>
int main(void){
long unsigned int size = 2,i;
char **array;
array = malloc(sizeof(char*) * size * size);
if (array == NULL){
printf("Error, Fix it!\n");
exit(2);
}
for (i = 0; i < size; i++){
array[i] = malloc(sizeof(char*) * 100);
}
/* do code here */
for (i = 0; i < size; i++){
free(array[i]);
}
free(array);
return 0;
}