#c #arrays #memory #pointers #malloc
#c #массивы #память #указатели #malloc
Вопрос:
РЕДАКТИРОВАТЬ: я изменил свою программу в соответствии с предложениями, которые сделали люди, но я не могу исправить утечки памяти. Кроме того, мне нужно освободить их без использования argc, поэтому мне нужно как-то отслеживать длину массива, поэтому я пометил последний элемент как null.
В настоящее время я пишу программу на C, которая копирует аргументы командной строки в динамически выделяемый массив. Мой код выглядит так:
char **array;
int j;
array = malloc(sizeof(char*) * (argc 1));
int i;
int index = 0;
for(i = 0; i < (argc); i ){
int length = strlen(*(argv i));
array[i] = malloc((length 1) * sizeof(char));
// Cycle through all the chars and copy them in one by one
for(j = 0; j <= length; j ){
array[i][j] = toupper(argv[i][j]);
}
}
array[i 1] = NULL;
return array;
Позже я пытаюсь освободить память:
char** array_copy = array;
while(*array_copy != NULL){
free(*array_copy );
}
free(*array_copy) // free the null at the end
free(array);
Тем не менее, я все еще получаю утечки памяти. Я не совсем уверен, что я делаю неправильно. Если бы кто-нибудь мог дать мне советы, это было бы здорово.
Спасибо!
Комментарии:
1. Почему вы используете malloc
argc 1
для массива? Вам нужно толькоargc
время. Также вашwhile
цикл удаления нарушен. Всегда подсчитывайте размер массива.
Ответ №1:
Ваша последняя строка free(array)
не освобождает ваш исходный malloc, потому что вы увеличили array
его по мере освобождения его содержимого.
Также (как указывают другие):
-
ваш цикл для освобождения содержимого массива проверяет ненулевое значение, но вы не гарантируете, что элементы изначально равны нулю.
-
Вы выделяете элементы argc 1 в массиве, когда вам нужен только argc.
-
*(argv i)
то жеargv[i]
самое, что и .
Комментарии:
1. Я изменил код в соответствии с вашими (и другими) предложениями, но у меня все еще происходит утечка памяти. Причина, по которой я использую argc 1, заключалась в добавлении нулевого элемента для отслеживания конца массива, поскольку для назначения мне не разрешалось использовать цикл с argc в качестве счетчика. Извините за путаницу, я отредактировал свой пост, чтобы соответствовать моему текущему коду.
Ответ №2:
array
было полностью
отключено с самого начала. Это free(array)
повреждает вашу кучу, а не освобождает.
Добавить
char ** array_iter = array;
а затем измените цикл на
while(*array_iter){
free(*array_iter );
}
free(array);
Ответ №3:
Используя post-increment, вы устанавливаете указатель равным чему-то отличному от того, что было изначально. Вы больше не освобождаете нужную память.
Ответ №4:
Ваш цикл while не работает. Сначала выделите только argc
время для char*
. Затем выделите strlen 1
для каждой строки (нулевой терминатор) strcpy
, чтобы скопировать строки и затем ввести их в верхний регистр (меньше подвержены ошибкам). Тогда сделайте free
вот так:
for(int i = 0; i < argc; i) free(array[i]);