Приведение типов указателя c ++ - PullRequest
0 голосов
/ 02 августа 2020
#include <iostream>

#define print(x) std::cout << x;
#define println(x) std::cout << x << std::endl;

int main() {
    int ex[5];
    int* ptr = ex;
    for (int i = 0; i < 5; i++) {
        ex[i] = 2;
    }
    ex[2] = 3;
    *(int*)((char*)ptr + 8) = 4;
    println(ex[2]);
}

в строке 13 я использую (char *), и когда я запускаю println(sizeof(char*)), он говорит, что это 4 байта, но мой инструктор говорит, что это 1 байт, поэтому нам нужно добавить 8 байтов для доступа к значению в примере [2], как такое могло быть, я не понял! : /

1 Ответ

1 голос
/ 02 августа 2020

Это зависит от используемой вами архитектуры. По определению char - это тип, который имеет размер 1, поэтому sizeof (char) оценивается как 1, но это не означает автоматически, что это 8 бит.

Чтобы получить доступ к следующему значению, вы должны добавить sizeof (int) на указатель, чтобы ваш код работал независимо от архитектуры, на которой он используется.

Когда вы работаете с указателями, вы сообщаете компилятору, что значение, на которое указывает указатель, занимает пространство этого типа в память, и следующая вещь в памяти должна быть после этого количества единиц (байтов). Поэтому, если вы приведете указатель int к указателю char, вы должны добавить sizeof (int) к указателю char, чтобы иметь тот же эффект, что и при добавлении 1 к указателю int. Это связано с тем, что char по определению автоматически составляет 1 единицу, если вы будете использовать что-либо, кроме char, это не сработает, нет архитектурно-независимой спецификации размеров типов.

...