C. malloc() и free() в функции не работают

Может кто-нибудь сказать мне, почему я не могу выделить память для массива структур через функцию 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);

Что вы подразумеваете под «память все еще выделена»? Как вы это проверяете?

Yksisarvinen 17.12.2020 18:02

C (а для этого кода также C++) использует передачу по значению. Так что init(numbers); в вашем случае то же самое, что и init(NULL);. Другими словами - функция ничего не знает о numbers

Support Ukraine 17.12.2020 18:03

Также обязательный комментарий о том, что использование malloc() без размещения new является неопределенным поведением в C++.

Yksisarvinen 17.12.2020 18:05

@Yksisarvinen Когда я использую " printf("Size: sizeof(number[0])); " он по-прежнему говорит, что на этот адрес выделено 16 байт.

jupiter 17.12.2020 18:55
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
6
4
215
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В первом фрагменте кода вы передаете значение переменной numbers. В функции вы изменяете локальную переменную, и это не влияет на переменную, вызывающую функцию.

Во втором фрагменте вы правильно передаете адрес numbers, чтобы его можно было установить в функции, и вызов free также правильный. Только не пытайтесь использовать значение numbers после его освобождения, иначе это поведение undefined.

Спасибо за ваш ответ. Проблема в том, что когда я использую " printf("Size: %ld", sizeof(*numbers[0])); " я получаю 16 байт. Так что free() ничего не освобождает.

jupiter 17.12.2020 19:03

@jupiter Это не говорит о том, что байты распределены. Оператор sizeof дает вам размер в байтах типа операнда и оценивается во время компиляции. Невозможно проверить, что free работает без использования инструмента отладки памяти, такого как valgrind.

dbush 17.12.2020 19:15

Теоретически это означает, что мне не нужно беспокоиться, когда "sizeof" дает 16 байт. Спасибо.

jupiter 17.12.2020 19:18

Другие вопросы по теме