C: Доступ к 'char' в определенном месте памяти? - PullRequest
2 голосов
/ 29 ноября 2010

Мне было интересно получить доступ к частям памяти, которые я выделил для лучшего понимания вещей, скажем, я выделил 10 байтов с malloc и printf("%p", &foo) возвращает 0xff0a, смогу ли я выделить 0xff0a->0xff1a (моя шестнадцатеричная математика на данный момент плохая) и доступ к любому из этих отдельных байтов?

Мне кажется, я помню, что использовал ключевое слово volatile вместе с адресом памяти для этого, хотя я не уверен, что этот код смог сделать ..

Я предполагаю, что я имею в виду, как мне получить доступ к случайному байту в памяти, приведенному как символ или целое число, которое я могу сохранить в указателе для доступа к нему позже.

Ответы [ 4 ]

5 голосов
/ 29 ноября 2010

Я предполагаю, что вы хотите получить доступ к одному байту из многобайтового типа, такого как int или short. Обычная идиома состоит в том, чтобы преобразовать адрес в символ * и почтение, например:

#include <stdio.h>

int main(void)
{
    int foo = 0xDEADBEEF;
    int i;

    for (i = 0; i < 4; i++) {
        printf("byte %d of foo is x%02X\n", i, *((unsigned char*)&foo + i));
    }
    return 0;
}

выход

$ ./a.out
byte 0 of foo is xEF
byte 1 of foo is xBE
byte 2 of foo is xAD
byte 3 of foo is xDE

Примечание Причина, по которой он смотрит назад, заключается в том, что x86 имеет младший порядок байтов

3 голосов
/ 29 ноября 2010

printf("%p", &foo) печатает адрес переменной указателя foo, , а не адрес, содержащийся в foo (это тот, который пришел от malloc) Вы действительно хотите:

printf("%p", (void *)foo);

Если вы хотите получить доступ к 10 байтам в памяти, на которые указывает foo, вы можете просто использовать:

char *p = foo;

, а затем получить доступ от p[0] до p[9].

0 голосов
/ 19 марта 2017

Возможно, вы захотите использовать объединение, чтобы всегда применять один и тот же набор кода для циклического перебора области байтов вашей переменной. «Байт» участника всегда будет указывать на тот же адрес, что и остальные. Вы можете включить его в структуру, чтобы сохранить размер вместе с объединением. В конце вы просто вызываете функцию для распечатки или проверки содержимого группы памяти ...

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>

union byteMap {
  char* addressString;
  void* addressInt;
  unsigned char* byte;
};

struct structByteMap {
  size_t size;
  union byteMap map;
};

int main (int argc, char* argv[]) {

  struct structByteMap map;

  if (argc > 1) {
    int temp = strtoimax(argv[1], NULL, 10);
    map.map.addressInt = &temp;
    map.size = sizeof(int);
  } else {
    map.map.addressString = "HELLO, YES HELLO";
    map.size = strlen(map.map.addressString);
  }

  for (int i = 0; i < map.size; i++) {
    printf("byte %d of param is x%02X\n", i, *(map.map.byte + i));
  }

}
0 голосов
/ 29 ноября 2010

Если вы выделите 10 байтов из 0xff0a, диапазон адресов будет: 0xff0a до 0xFF14.

volatile заставляет компилятор каждый раз захватывать сохраненное значение в этом месте. Это используется в аппаратном программировании и многопоточных приложениях.

В этом примере адрес int x сохраняется в указателе p:

int x = 5;
int * p = &x; //assign address of (operator &) x into a pointer
printf("%d\n", *p); // will display 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...