2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Язык Си. Динам. память, инициализация массива.
Сообщение14.03.2010, 20:08 


19/10/09
17
Здравствуйте.
Если мы задаем элементы массива при написании программы, это выглядит так:
char a[] = "asdfghjkl";
Если же элементы массива входящие данные (не с командной строки), то следующие действия:
char a[0];
gets(a);
вызывают переполнение буфера.

Вопрос: Возможно ли, если да то как, инициализировать массив так, чтобы входящие данные (количество элементов) автоматически задавали выделенную под него память наподобие тому, как задается массив при написании программы? Избыток выделенной памяти либо переполнение буфера исключено.

 Профиль  
                  
 
 Re: Язык Си. Динам. память, инициализация массива.
Сообщение14.03.2010, 20:40 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Читать посимвольно, при переполнении увеличивать буфер (обычно увеличивают в 2 раза).

 Профиль  
                  
 
 Re: Язык Си. Динам. память, инициализация массива.
Сообщение14.03.2010, 21:50 


19/10/09
17
Написал поэлементную проверку-присваивание, но не работает должным образом, считывает и выводит лишь 3 элемента в массиве. Буду благодарен, если найдете ошибку.

int main()
{
char *a = malloc(sizeof(char)); //инициализация динамического массива
int i;

for (i = 0; a[i] != '\0'; i++) /*пока не конец строки выделяем память для элемента типа char, считываем и присваиваем i-тий элемент. */
{

if (i > 0) *a = malloc((i+1)*sizeof(char));
scanf("%c", &a[i]);
}
puts(a);
getch();
}

 Профиль  
                  
 
 Re: Язык Си. Динам. память, инициализация массива.
Сообщение14.03.2010, 22:18 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Ну, во-первых, строка заканчивается не нулем, а '\n'.
Во-вторых, нужно использовать realloc, потому что а не копируется из старого значения при malloc (и получается дофига лишней выделенной памяти, но это уже не логическая ошибка).

Если будете еще код сюда писать, заключайте его, пожалуйста, в тэг [code]

 Профиль  
                  
 
 Re: Язык Си. Динам. память, инициализация массива.
Сообщение15.03.2010, 01:44 


04/02/08
325
Буково
Используйте функцию getline: она автоматически выделяет нужное количество памяти:
Код:
           char * line = NULL;
           size_t len = 0;
...
           getline(&line, &len, fp)
...
           if (line)
               free(line);

 Профиль  
                  
 
 Re: Язык Си. Динам. память, инициализация массива.
Сообщение15.03.2010, 02:37 


30/12/09
95
Alex696 в сообщении #297718 писал(а):
Если же элементы массива входящие данные (не с командной строки), то следующие действия:
char a[0];
gets(a);
вызывают переполнение буфера.

Естественно вызывают, ибо вы используете буфер нулевой длины, который только что определили.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group