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