LINUX.ORG.RU

Динамическое распределение памяти

 ,


0

1

Добрый день. Тут прочитал великое писание, и захотел наконец разобраться с указателями и динамическим выделением памяти. Наваял быдлокода. До этого только писал на бедоне. Пожалуйста укажите что я делаю неправильно.

#include <stdio.h>
#include <stdlib.h>

struct T **init(int *size);
void extend(struct T ***arr, int *size);
void freeall(struct T ***arr, int *size);

struct T
{
	int i;
};

int main(int argc, char *argv[])
{
	int arrsize = 5;
	int i;
	struct T **arrt;
	arrt = init(&arrsize);
	for (i = 0; i < arrsize; i++) {
		arrt[i]->i = ((i + 1) * (i + 1));
	}
	for (i = 0; i <= 5; i++) {
		extend(&arrt, &arrsize);
		arrt[arrsize - 1]->i = (arrsize * arrsize);
	}
	for (i = 0; i < arrsize; i++) {
		printf("%d\n", arrt[i]->i);
	}
	freeall(&arrt, &arrsize);
	return 0;
}

struct T **init(int *size)
{
	int i;
	struct T **arrt;
	arrt = calloc(*size, sizeof(int *));
	if (!arrt) {
		fprintf(stderr, "error\n");
		exit(1);
	}
	for (i = 0; i < *size; i++) {
		arrt[i] = calloc(1, sizeof(struct T *));
		if (!(arrt[i])) {
			fprintf(stderr, "error\n");
			exit(1);
		}
	}
	return arrt;
}

void extend(struct T ***arr, int *size)
{
	int oldsize = (*size)++;
	*arr = realloc(*arr, (sizeof(int *) * *size));
	if (!(*arr)) {
		fprintf(stderr, "error\n");
		exit(1);
	}
	(*arr)[oldsize] = calloc(1, sizeof(struct T *));
	if (!((*arr)[oldsize])) {
		fprintf(stderr, "error\n");
		exit(1);
	}
}

void freeall(struct T ***arr, int *size)
{
	int i;
	for (i = 0; i < *size; i++) {
		free((*arr)[i]);
	}
	free((*arr));
}

PS: Извините за табы.

★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

слишком много звезд

anonymous
()
void extend(struct T ***arr, int *size);

Теперь берёшь и прямо пишешь, зачем тебе указатель на указатель на указатель на твою структуру.

Без комментариев это можно сразу выбросить.

Lilly
()
arrt = calloc(*size, sizeof(int *));

Зачем тебе память по size указателей на int?

arrt[i] = calloc(1, sizeof(struct T *));
Почему ты выделяешь память под указатель на T и приводишь его к (int *)? Так не нужно, ты наверное хотел
arrt = calloc(*size, sizeof(struct T));
т.е. просто массив из size struct T? Или ты явно хочешь массив указателей на указатели на структуру?

Вообще айяйай постить неработающий код:

arrt[i]->i = ((i + 1) * (i + 1));
arrt[i] это указатель на struct T. А память под него ты выделил?

naszar
()
Последнее исправление: naszar (всего исправлений: 1)
Ответ на: комментарий от Lilly

Да, намудрил но как мне сделать динамический массив структур например?

Я в этих вопросах очень сильно плаваю поэтому тут и спросил.

Вообще я чувствую что сильно туплю...

itn ★★★
() автор топика
Ответ на: комментарий от naszar

Или ты явно хочешь массив указателей на указатели на структуру?

Да

arrt это указатель на struct T. А память под него ты выделил?

Так вроде выделил. В функциях init и extend.

itn ★★★
() автор топика
Ответ на: комментарий от itn

И есть ещё очень глупый вопрос, вот к примеру есть

malloc(sizeof(int))
и
malloc(sizeof(int *))
В обоих случаях он же выделит одинаковое количество памяти или нет? Вобщем я не могу понять разницу.

itn ★★★
() автор топика
Ответ на: комментарий от itn

Нет. В первом случае под int, а во втором под указатель на него. Проверь себя:

	printf("sitzeof(T)=%d,sizeof(T *)=%d\n"
			, sizeof(struct T),sizeof(struct T *));
И кстати а зачем тебе массив указателей на указатели на структуру?

naszar
()
Ответ на: комментарий от itn

в скобках sizeof — тип, размер которого ты хочешь получить. Разница заключается в том, что int — 32-битное целочисленное, а (int *) — указатель на 32-битное целочисленное. Последний может быть 64-битным и 32-битным, в зависимости от разрядности ОС.

gavlig ★★★
()
Ответ на: комментарий от itn

В первом случае будет выделена память размером в int, во втором случае - размером в указатель на int.

Ты очень-очень плохо читал, иди перечитывай.

Lilly
()
Ответ на: комментарий от itn

Дауж всё понял. Но меня сбило с толку что код вроде бы как работал.

itn ★★★
() автор топика

начни с простой мысли:

указатель == индекс в массиве размером с память.

умеешь в массивы умеешь в указатели.

не умеешь в указатели - значит не умеешь в массивы.

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.