Ответ на вопрос, где хранятся массивы или даже любые переменные, зависит от того, рассматриваете ли вы абстрактную машину или реальное оборудование. Стандарт C определяет, как все работает на абстрактной машине, но соответствующий компилятор может делать что-то еще на реальном оборудовании (например, из-за оптимизации), если наблюдаемые эффекты одинаковы.
(На абстрактной машине массивы обычно хранятся в том же месте, что и другие переменные, объявленные в той же области видимости.)
Например, переменная может быть помещена в регистр вместо стека или полностью оптимизирована. Как программисту вы, как правило, не должны заботиться об этом, поскольку вы также можете просто рассмотреть абстрактную машину. (Возможно, в некоторых случаях вы заботитесь об этом, и на микроконтроллерах с очень ограниченным объемом ОЗУ одна из причин может заключаться в том, что вы должны быть очень экономными в использовании стека и т. Д.)
Что касается вашего кода для чтения из памяти: он не может работать. Если size
- это размер памяти, доступной для переменных, вы не можете поместить массив bufferf[size]
в эту память вместе со всем остальным .
К счастью, копирование содержимого памяти в отдельный буфер не требуется. Рассмотрим вашу строку bufferf[e] = *(mem_start + e)
- поскольку вы уже можете прочитать произвольный индекс e
из памяти на mem_start
, вы можете использовать *(mem_start + e)
(или, лучше, mem_start[e]
, что в точности эквивалентно) непосредственно везде, где бы вы ни использовали bufferf[e]
! Просто обработайте mem_start
как указание на первый элемент массива size
байтов.
Также обратите внимание, что если вы программно ищете содержимое массива tab
, его элементы равны int
с, поэтому они имеют более одного байта каждый - вы просто не найдете пять смежных байтов с этими значениями .
(Опять же, вы также можете просто взять адрес tab[0]
и выяснить, где он хранится, т. Е. ((unsigned char *) tab) - mem_start
- это индекс tab
в mem_start
. Однако, наблюдение за ним может измениться вещи из-за вышеупомянутой оптимизации.)