Может кто-нибудь сказать мне, почему я не могу выделить память для массива структур через функцию init()? Когда это делается вручную в main, все в порядке. При попытке через init() ничего не происходит (также нет сообщения об ошибке). Адрес всегда 0x0, я думаю, нулевой указатель.
#define GAMES 100
typedef struct{
double *scores;
}SCORES;
void init(SCORES *arr);
int main(){
SCORES *numbers = NULL;
init(numbers);
printf("Adress is: %p\n", numbers); //Still 0x0
return 0;
}
void init(SCORES *arr){
arr = (SCORES*) malloc(GAMES * sizeof(SCORES));
}
Попытка с кодом ниже работает для malloc. Я получаю адрес, но если я использую free(), память все еще выделяется.
void init(SCORES **arr){
*arr = (SCORES*) malloc(GAMES * sizeof(SCORES));
}
...
init(&numbers);
...
free(numbers);
C (а для этого кода также C++) использует передачу по значению. Так что init(numbers); в вашем случае то же самое, что и init(NULL);. Другими словами - функция ничего не знает о numbers
Также обязательный комментарий о том, что использование malloc() без размещения new является неопределенным поведением в C++.
@Yksisarvinen Когда я использую " printf("Size: sizeof(number[0])); " он по-прежнему говорит, что на этот адрес выделено 16 байт.



В первом фрагменте кода вы передаете значение переменной numbers. В функции вы изменяете локальную переменную, и это не влияет на переменную, вызывающую функцию.
Во втором фрагменте вы правильно передаете адрес numbers, чтобы его можно было установить в функции, и вызов free также правильный. Только не пытайтесь использовать значение numbers после его освобождения, иначе это поведение undefined.
Спасибо за ваш ответ. Проблема в том, что когда я использую " printf("Size: %ld", sizeof(*numbers[0])); " я получаю 16 байт. Так что free() ничего не освобождает.
@jupiter Это не говорит о том, что байты распределены. Оператор sizeof дает вам размер в байтах типа операнда и оценивается во время компиляции. Невозможно проверить, что free работает без использования инструмента отладки памяти, такого как valgrind.
Теоретически это означает, что мне не нужно беспокоиться, когда "sizeof" дает 16 байт. Спасибо.
Что вы подразумеваете под «память все еще выделена»? Как вы это проверяете?