2013-08-02 3 views
-4

Назначить ячейку памяти с адресом 0x67AB и значением 0x1234 с использованием указателей. Я пытаюсь назначить фиксированное местоположение в памяти с помощью указателей и не использовать malloc()Исправлено расположение памяти в C

+4

Выполнено. Что теперь? – Puppy

+0

В общем, код, подобный этому, скорее всего, сбой. У вас есть дополнительная информация, не включенная в вопрос, который гарантирует, что этот адрес можно записать по вашему коду? – simonc

+0

У вас есть гарантия, что можно написать адрес 0x67AB? – BLUEPIXY

ответ

1

Следующий код записывает 0x1234 на адрес 0x67AB в адресном пространстве процесс выполнения, если ваша реализация C поддерживает это поведение (поскольку оно выходит за рамки, что требует стандарт C). Возможно, вам понадобится использовать тип, отличный от uint16_t, в зависимости от ваших точных потребностей. Если вы не знаете, что вы делаете, это код, скорее всего, выходят из строя или вызвать другие проблемы:

#include <stdint.h> 
… 
* (uint16_t *) 0x67AB = 0x1234; 
+0

+1 Мне нравится сжатость '* (uint16_t *) 0x67AB = 0x1234;'. – chux

1

Если ваша программа запущена в операционной системе, вы не сможете записать ее в место исправления. Чтобы сделать что-то подобное, вашей программе необходимо будет иметь корневой доступ и сделать системный вызов, чтобы сама оперативная система записывала в этом месте.

Однако, если вы пишете программу для микроконтроллера или встроенной системы это, как вы это делаете:

char* p = (char*)0x67AB; 
p[0] = 0x12; // You need to write each byte at a time. 
p[1] = 0x34; 
+0

Работа в операционной системе с виртуальным адресным пространством запрещает вам писать на произвольный адрес физической памяти. Это не мешает вам писать на фиксированный адрес виртуальной памяти, если этот адрес отображается. Это случается очень редко, если разделы загрузчика или программы, связанные с процессом, обеспечивают гарантии того, что определенные адреса используются для определенных целей. –

+1

Должен ли быть записан байт за раз, и является ли он правильным для их написания, зависит от реализации. Также '67ABh' не является стандартным синтаксисом C. Это должно быть '0x67AB', и оно должно быть передано' char * '. –

+0

Я думаю, что ты прав. Прошло много времени с тех пор, как я написал чистый C, поэтому я не очень хорошо это помню. Я думаю, теперь я исправил это. – Marcos

1

Предполагая, что вы знаете, записи на определенный адрес, если ОК, как в ПОС или контроллера:

#include <stdint.h> 
int16_t *ptr = (int16_t *) 0x67AB; 
*ptr = 0x1234; 

Поскольку конечный элемент integer не указан, байт-байтовая настройка может не обеспечивать ожидаемое поведение.

Смежные вопросы