Я пытался выполнять побитовые операции над массивом символов, как если бы он был целым числом, по существу обрабатывая байты как непрерывную область в памяти.Приведенный ниже код иллюстрирует мою проблему.
char *cstr = new char[5];
std::strcpy(cstr, "abcd");
int *p = (int *)(void *)cstr;
std::cout << *p << " " << p << "\n";
std::cout << cstr << " " << (void *)cstr << "\n";
std::cout << sizeof(*p) << "\n";
(*p)++;
std::cout << *p << " " << p << "\n";
std::cout << cstr << " " << (void *)cstr << "\n";
Получается следующий вывод:
1684234849 0x55f046e7de70
abcd 0x55f046e7de70
4
1684234850 0x55f046e7de70
bbcd 0x55f046e7de70
Краткое объяснение кода и его работы (на мой взгляд):
Я инициализирую cstr с помощью "abcd"
char *cstr = new char[5];
std::strcpy(cstr, "abcd");
Я указываю p на адрес cstr и указываю, что хочу, чтобы он был int
int *p = (int *)(void *)cstr;
Я проверяю, что pуказывая, где он должен и что он занимает 4 байта
std::cout << *p << " " << p << "\n";
std::cout << cstr << " " << (void *)cstr << "\n";
std::cout << sizeof(*p) << "\n";
Затем я увеличиваю целое число по адресу p, указывающему на
(*p)++;
Так что теперь, так как "abcd" является смежнымблок из 32 битов в памяти, увеличение на 1 должно привести к появлению "abce".Вместо этого код успешно увеличивает целое число, но оставляет массив char как «bbce».Эта последняя часть проверяет новые значения целых чисел и cstr
std::cout << *p << " " << p << "\n";
std::cout << cstr << " " << (void *)cstr << "\n"
Это ожидаемое поведение?
PS: я скомпилировал код на машине linux с помощью этой команды: g ++ main.cpp-o main.
file main
выдает следующий вывод: "1: 64-битный общий объект LSB ELF, x86-64, версия 1 (SYSV), динамически связанный, интерпретатор / lib64 / ld-linux-x86-64.so.2, для GNU / Linux 3.2.0 "