Member 14042074 Ответов: 1

Выделить память в C


Привет,
Я должен написать 2 функции типа void, которые работают по адресу указателей. Первая функция резервирует память для массива объектов класса. Вторая функция резервирует память для массива указателей на объект класса. Я не знаю, как это должно работать и как я могу доставить и работать по адресу указателя.

Что я уже пробовал:

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

class my_class {
	int i;
};

void FAlocate(my_class ***Tab, int amount) {
	Tab = (my_class**)malloc(sizeof(my_class*)*amount);
	for (int i = 0; i < amount; i++) {
		Tab = (my_class*)malloc(sizeof(my_class));
	}
}

void FAlocate(my_class **Tab, int amount) {
	*Tab = (my_class*)malloc(sizeof(my_class)*amount);
}

int main(void)
{
	int N = 10;
	my_class **Tab=NULL;
	my_class *Tab1 = NULL;
	FAlocate(&*Tab, N);
	FAlocate(&Tab1, N);
}

1 Ответов

Рейтинг:
2

Afzaal Ahmad Zeeshan

Во—первых, это не C, это C++ (у вас есть класс в нем!), во-вторых, поскольку это C++, зачем привлекать слишком много указателей, когда вы можете легко использовать другие методы, чтобы сделать то же самое-почему указатель на указатель на указатель? Возможно, вы немного путаете оператор pointers-are-arrays в своей функции,

void FAlocate(my_class ***Tab, int amount) {
	Tab = (my_class**)malloc(sizeof(my_class*)*amount); // my_class** to my_class***? 
	for (int i = 0; i < amount; i++) {
		Tab = (my_class*)malloc(sizeof(my_class)); // my_class* to my_class***
	}
}
Вы выделяете память для перехода от указателя к указателю, а затем продолжаете обновлять ее с помощью значения указателя внутри цикла. Вместо этого вы пытаетесь заставить компилятор построить программу, в которой не соблюдаются языковые конструкции и безопасность типов. Тебе не кажется, что так и должно быть?
void FAlocate(my_class ***Tab, int amount) {
	Tab = (my_class**)malloc(sizeof(my_class*)*amount);
	for (int i = 0; i < amount; i++) {
		Tab[i] = (my_class*)malloc(sizeof(my_class)); // I know the cast is "still" incorrect
	}
}
Это должно выделить память для элементов списка. Я намеренно игнорирую здесь концепцию 3-мерного массива, потому что сам код не имеет большого смысла.

Я закончу это с помощью этого, в C++, использования new и delete! Есть причина, по которой они создаются на языке поверх malloc и free функции, предоставляемые в стандартной библиотеке C.

c++ - в чем разница между new/delete и malloc/free? - переполнение стека[^]


Member 14042074

Я знаю, что этот код сбивает с толку, и гораздо проще было бы использовать операторы C++ new и delete или просто создать функцию, возвращающую тип класса, но это выдержка, которую дал мне мой профессор в университете - он не объяснил, как я должен написать ее, чтобы сделать это - просто сделайте это T_T

Afzaal Ahmad Zeeshan

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

Попробуйте почитать, здесь.