Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия, Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки
Здравствуйте. Если мы задаем элементы массива при написании программы, это выглядит так: char a[] = "asdfghjkl"; Если же элементы массива входящие данные (не с командной строки), то следующие действия: char a[0]; gets(a); вызывают переполнение буфера.
Вопрос: Возможно ли, если да то как, инициализировать массив так, чтобы входящие данные (количество элементов) автоматически задавали выделенную под него память наподобие тому, как задается массив при написании программы? Избыток выделенной памяти либо переполнение буфера исключено.
Xaositect
Re: Язык Си. Динам. память, инициализация массива.
14.03.2010, 20:40
Читать посимвольно, при переполнении увеличивать буфер (обычно увеличивают в 2 раза).
Alex696
Re: Язык Си. Динам. память, инициализация массива.
14.03.2010, 21:50
Написал поэлементную проверку-присваивание, но не работает должным образом, считывает и выводит лишь 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(); }
Xaositect
Re: Язык Си. Динам. память, инициализация массива.
14.03.2010, 22:18
Ну, во-первых, строка заканчивается не нулем, а '\n'. Во-вторых, нужно использовать realloc, потому что а не копируется из старого значения при malloc (и получается дофига лишней выделенной памяти, но это уже не логическая ошибка).
Если будете еще код сюда писать, заключайте его, пожалуйста, в тэг [code]
Ed_Em
Re: Язык Си. Динам. память, инициализация массива.
15.03.2010, 01:44
Используйте функцию getline: она автоматически выделяет нужное количество памяти:
Код:
char * line = NULL; size_t len = 0; ... getline(&line, &len, fp) ... if (line) free(line);
Roman Voznyuk
Re: Язык Си. Динам. память, инициализация массива.