Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2014, 19:55   #1
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию Си.Динамические массивы.Вопросы

Пример из книги Практика программирования(Роб Пайк,Брайан Керниган) Тема Расширяемые массивы.
Код:
#include<stdio.h>
#include<stdlib.h>
typedef struct Nameval Nameval;
struct Nameval
{
	char*name;
	int value;
};
struct Nvtab
{
	int nval; //текущие количество элементов
	int max;// под сколько элементов выделена память
	Nameval*nameval; 
}nvtab;
enum{NVINIT=1,NVGROW=2};

int addname(Nameval newname)
{
	Nameval*nvp;
	if(nvtab.nameval==NULL)
	{
		nvtab.nameval=(Nameval*)malloc(NVINIT*sizeof(Nameval));
		if(nvtab.nameval==NULL)
			return -1;
		nvtab.max=NVINIT;
		nvtab.nval=0;
	}
	else if(nvtab.nval>=nvtab.max)
	{
		nvp=(Nameval*)realloc(nvtab.nameval,(NVGROW*nvtab.max)*sizeof(Nameval));
		if(nvp==NULL)
			return -1;
		nvtab.max*=NVGROW;
		nvtab.nameval=nvp;
	}
	nvtab.nameval[nvtab.nval]=newname;
	return nvtab.nval++;
}

void main()
{
	Nameval c;
	c.name="aleksey";
	c.value=222;
	addname(c);
	c.name="ivan";
	c.value=333;
	addname(c);
	printf("%s\n%d\n",nvtab.nameval[0]);
	printf("%s\n%d\n",nvtab.nameval[1]);
}
p.s. Ну в книге конечно код без main

Я правильно понял процесс весь? можно так это описать?

Когда вызывается функция malloc передается аргумент в виде размера структуры Nameval,этим аргументом мы говорим какой выделить размер отдельного пространства памяти(динамическая память) и оно никогда не пересекается с обычным пространством памяти(статическая память).И malloc после завершения вызова возвращает адрес указателя на начало этого отдельного пространства памяти и явное приведение типа перед функцией malloc указывает под какой тип данных нужно выделить это отдельное пространство памяти.
realloc перемещает динамическую память выделенную для указателя nameval в еще больший участок памяти в его начало.
После первого вызова функции addname(в которой вызывается функция malloc) указатель nameval надо называть статическим массивом указателей с определенным размером элементов(в данном примере 1 элемент) а после второго и последующих вызовов функции addname(вызовов функции realloc) изменяется его размер и правильней его уже называть - динамический массив указателей.


Код:
typedef struct Nameval Nameval;
struct Nameval
{
	char*name;
	int value;
	double g;
	char* b;
};
это можно записать вот так? и это одно и тоже?
Код:
typedef struct Nameval
{
	char*name;
	int value;
	double g;
	char* b;
}Nameval;
т.е. typedef struct Nameval Nameval; это прототипизация структуры получается?

Код:
struct Nvtab
{
	int nval;
	int max;
	Nameval*nameval; 
}nvtab;
это можно записать вот так?
Код:
struct
{
	int nval; 
	int max;
	Nameval*nameval; 
}nvtab;
тогда зачем в примере лишний заголовок структуры Nvtab который нигде в программе не используется?

Код:
nvtab.nameval=(Nameval*)malloc(NVINIT*sizeof(Nameval));
зачем единицу(NVINIT) умножать на sizeof(Nameval) ? и без этой единицы все нормально работает.Зачем эта единица?

Код:
if(nvtab.nameval==NULL)
	return -1;
Код:
if(nvp==NULL)
	return -1;
Я понимаю что это ,для того чтобы программа не использовала нулевой указатель.Но когда возвращается нулевой указатель функцией malloc и realloc?.В книге написано ,когда недостаточно объема динамической памяти.А когда его недостаточно?я не понимаю как это измеряется.Сколько нужно данных чтобы попасть в return?надо объявить огромное кол-во полей структуры?Сколько примерно?или это сложно посчитать?

Т.е. когда я не использую в коде new(С++) malloc(Си), я пользуюсь всегда только статической памятью?
alekopoko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические массивы [ICQ] Помощь студентам 3 20.02.2015 17:31
динамические массивы Dimarik Visual C++ 10 27.05.2011 12:25
Динамические массивы Solnze2 Помощь студентам 0 22.05.2011 20:54
Динамические массивы и массивы варианты N@stya Помощь студентам 0 11.06.2010 21:09