Я знаю, что не рекомендуется использовать malloc во встроенной среде, но я нашел пример, относящийся к тому, что мне нужно, который использовал его, и он работал нормально для меня.
Это код, выполнение которого я нахожу слегка озадачивающим:
uint8_t * buffer; // pointer to buffer
uint8_t * buffer1; // pointer to buffer1
uint8_t * buffer2; // pointer to buffer2
buffer = malloc(400 * sizeof(uint8_t)); // size of buffer
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer1
buffer2 = malloc(400 * sizeof(uint8_t)); // size of buffer2
Это контрольные окна для значений указателей в начале выполнения отладки.

После выполнения до точки останова, расположенной после конца приведенного выше фрагмента кода.

При пошаговом использовании отладчика после строк malloc
я вижу, что в первой строке будет выделен адрес для указателя buffer
. Это будет сделано только для buffer
, но не для buffer1
или buffer2
.
Это верно при изменении порядка выделения памяти, как показано в коде ниже:
uint8_t * buffer; // pointer to buffer
uint8_t * buffer1; // pointer to buffer1
uint8_t * buffer2; // pointer to buffer2
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer
buffer = malloc(400 * sizeof(uint8_t)); // size of buffer1
buffer2 = malloc(400 * sizeof(uint8_t)); // size of buffer2
В этом случае указатель buffer1
будет иметь ненулевое значение, в то время как другие будут нулевыми, как показано ниже.

Проверка кода, подобного приведенному ниже, приведет к тому, что он присваивает значение указателю buffer1
, и при повторном выделении ему памяти снова устанавливает его на ноль.
uint8_t * buffer; // pointer to buffer
uint8_t * buffer1; // pointer to buffer1
uint8_t * buffer2; // pointer to buffer2
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer1
buffer = malloc(400 * sizeof(uint8_t)); // size of buffer
buffer1 = malloc(400 * sizeof(uint8_t)); // size of buffer1
Код падает ниже по строке, когда assert () выполняется для пустого значения указателя, когда инициализируется структура с одним из буферов.
Я использую malloc для начала только из-за этого кода для реализации циклического буфера , который я нашел в сети.
Хотя я не новичок в вещах, связанных с указателями / памятью, это удивляет меня чаще, чем нет. Я предполагаю, что я совершенно не понимаю, как распределяется память (или нет) или как окна отладчика и окна наблюдения обновляют значения указателя.
Спасибо за вашу помощь.