C Компилятор Keil использует mallo c для локальных переменных, почему? - PullRequest
4 голосов
/ 02 марта 2020

У меня была проблема где-то в моем коде в функции, которую я хотел объявить массив, но это не удалось. после некоторой отладки я обнаружил, что он использует mallo c в окне дизассемблирования, поэтому я увеличил размер кучи, и он работает отлично!

Итак, мой вопрос: почему keil использует Heap для локальной переменной?

Вот код объявления переменной:

uint8_t result[data->capacityBytes];
memset(result, 0, sizeof(result));

Я добавил флаг C99

Ответы [ 2 ]

6 голосов
/ 02 марта 2020

Ваш массив имеет динамический c размер, т.е. компилятор не знает, насколько он будет большим, до времени выполнения. Эта функция, представленная в C99, называется массивами переменной длины (VLA).

Согласно документации Keil (см. Примечание), такие массивы выделяются в куче этим компилятором. (Другие могут размещаться в стеке. Другие могут вообще не реализовывать эту функцию - она ​​стала необязательной в C11.)

4 голосов
/ 02 марта 2020

Ваша локальная переменная result объявляется следующим образом:

uint8_t result[data->capacityBytes];

Если предположить, что data->capacityBytes не является константой, это будет означать, что result будет Массив переменной длины (VLA) , который объясняет поведение используемого вами компилятора.

Тогда вы предполагаете, что расположение переменной в зоне памяти стандартизировано, что, к сожалению, неверно, как описано в этом ответе :

Язык C фактически не определяет, где хранятся какие-либо переменные. Однако он определяет три класса хранения: stati c, automati c и dynamici c.

Расположение места хранения переменной зависит от интерпретации вашего источника. код компилятором.

См. также запись в википедии о массиве переменной длины

Память

Распределение

...