Доступ к значениям, хранящимся в байтах в адресе памяти - PullRequest
1 голос
/ 28 октября 2019

Допустим, я выделил некоторую память и на нее есть указатель.

 Int *k = malloc(100);

После сохранения данных из файла по этому адресу памяти можно ли извлечь значение из n-го байта? Скажем, например, я хочу знать значение int в первом байте.

1 Ответ

1 голос
/ 29 октября 2019

Вы можете использовать указатель как массив, индексированный доступ - это просто синтаксический сахар для отмены ссылки на адрес со смещением. k[n] совпадает с *(k + n).

Чтобы проверить первый байт памяти, на которую указывает k для 0xFF, напишите:

if (*((char *)k + 0) == 0xFF) {
    /* ... */
}

Или напишите это:

if (((char *)k)[0] == 0xFF) {
    /* ... */
}

Или напишите это:

char* p = (char*)k;
if (p[0] == 0xFF) {
    /* ... */
}

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

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

int main(void) {
    int* pi = malloc(100 * sizeof *pi);
    if (!pi) {
        puts("Memory allocation error!");
        return 1;
    }

    pi[3] = 23;

    char* pc = (char*)pi;
    printf("%d\n", pc[3 * sizeof (int)]);

    printf("pi: %p %p\n", pi, pi + 3);
    printf("pc: %p %p\n", pi, pc + 3);
    return 0;
}
...