Запись элементов массива во внешнюю ячейку памяти на C

#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.