- ОС: Windows Vista (x86)
- Компилятор: Код::Блоки
В настоящее время я пишу программу, которая открывает указанный каталог и читает его содержимое. Вместо использования printf() для отображения имен файлов сразу после их обнаружения. Я храню их в памяти и показываю позже. Я использую следующий оператор if для запуска перераспределения памяти. Я также включил объявления соответствующих переменных.
//Represents what the new index will be after the current file name is added
//to 'stack.ptr'
#define NEW_INDEX (stack.index+(strlen(ptr_dirent->d_name)))
//Contains the pointer that points to the directory's contents 'stack.ptr',
//the size of 'stack.ptr' which is 'stack.size', and the current index
//'stack.index'
struct stack
{
int index;
char *ptr;
int size;
};struct stack stack;
//Sets the index to 0 and allocates 256 bytes of memory for 'stack.ptr'
stack.index = 0; stack.size = 256;
stack.ptr = malloc(sizeof(char)*stack.size);
if(NEW_INDEX > stack.size)
{
char *temp; stack.size *= 2;
temp = realloc(stack.ptr, sizeof(char)*stack.size);
if (temp == NULL)
{
printf("ERROR: %i Bytes of memory could not be allocated.\n", stack.size);
free(stack.ptr); closedir(dirp); return '\000';
}
else {stack.ptr = temp;}
}
Программа работает отлично, пока я не установил начальное значение 'stack.size' (которое является размером массива) равным 2, а не 256 (так что программа ДОЛЖНА перераспределять память). Моя программа дала сбой, потому что realloc() вернул NULL, но у меня было много доступной памяти. Я знаю, что realloc() сработал пару раз, потому что 'stack.size' был равен 16, когда произошел сбой ('stack.size' удваивается каждый раз при перераспределении памяти). Я попытался установить для «stack.size» несколько разных значений и обнаружил, что установка «stack.size» на 1 или 2 вызывает сбой, и это всегда происходит, когда «stack.size» достигает 16. Кто-нибудь может мне это объяснить. ? Я беспокоюсь, что даже если я установлю 'stack.size' на 256, моя программа может рухнуть, если каталог достаточно большой, чтобы вызвать перераспределение памяти. Также в несвязанной заметке я прочитал, что openddir("."); откроет текущий каталог, и я обнаружил, что это так, но по какой-то причине не все файлы в текущем каталоге находятся в 'stack.ptr' и файле . и .. отображаются, когда я вывожу содержимое stack.ptr в стандартный вывод.
sizeof(char)
всегда будет 1 - person Mike   schedule 19.12.2012stack.ptr
, как вы увеличиваетеstack.index
и т. д. Возможно, у вас есть логическая ошибка в этом коде, которая влияет на ваше управлениеstack.ptr
. Когда вы задаете такие вопросы, вам нужно знать все, что вы делаете. - person Remy Lebeau   schedule 19.12.2012std::string
сstd::vector
или другим контейнером STL вместо того, чтобы вручную управлять всей памятью? - person Remy Lebeau   schedule 19.12.2012std::string
иstd::vector
может быть немного сложным в C. На самом деле это более неудобно, чем ручное управление памятью. - person Daniel Fischer   schedule 19.12.2012