#arrays #c #pointers #memory
#массивы #c #указатели #память
Вопрос:
Я хочу записать элементы из 2D-массива в определенную ячейку памяти. Я попробовал это просто с одномерным массивом:
char arr[3]= {0x01, 0x02, 0x03};
int i=0;
uint32_t p= 0x40000000;
for(i=0; i<3;i )
{
*p=amp;arr[];
p
}
Выдает ошибку, что операндом * должен быть указатель.
Как я могу записывать элементы массива один за другим в местоположение 0x40000000?
Комментарии:
1.
int p= 0x40;
может бытьint *p= 0x40;
, но то, что вы пытаетесь, не является рекомендуемой операцией2.
*p=amp;arr[];
является неправильной. Может быть, вы хотите*p=arr[i];
?3.
p
->p ;
илиp;
4. да * p= arr[i]; @4386472
Ответ №1:
Похоже, вы хотите записать байты из массива в произвольную память. Это выполнимо, но вы должны быть уверены, что знаете, что делаете, прежде чем запускать такой код.
#include <stdint.h>
int main(){
char arr[3]= {0x01, 0x02, 0x03};
int i=0;
uint32_t* p= (uint32_t*) 0x40000000;
for(i=0; i<3;i )
{
*p=arr[i];
p ;
}
}
В частности, если у вас нет оснований полагать, что есть что-то действительное для записи по адресу at 0x40000000
в любой системе, в которой выполняется ваш код, с высокой вероятностью произойдет сбой.
Комментарии:
1. Учитывая, что данные в
arr
типе указателя могут бытьchar*
или даже лучшеvolatile char *
.2. @Gerhardh я полностью согласен. Я просто предоставляю минимальную модификацию кода OP для компиляции, не пытаясь точно угадать, чего они хотят.
3. спасибо за ваш вклад. 0x4000000 — это адрес внешней оперативной памяти, которую я использую.. мне нужно записать данные, поступающие в массив, из этого места для временного хранения, а затем обработать их. я попробую вышеуказанную модификацию и прокомментирую, дает ли она желаемый результат
4. Используя
uint32_t *
, код запишет 4 байта (3 из них ноль) в местоположения 0x40000000 ..0x40000003, еще 4 байта в местоположения 0x40000004 ..0x40000007 и еще 4 байта в местоположения 0x40000008 ..0x4000000B. Это не то же самое, что записывать 3 байта в местоположения 0x40000000 ..0x40000002.