C++ аллокация памяти

154
19 января 2020, 21:20
#include <iostream>
void main() {
  void* ptr = malloc(3);
  int *b = static_cast<int*>(ptr);
  *b = 2147483647;
  std::cout << *b; // 2147483647
}

У меня есть 3 байта пам'яти от malloc и sizeof(int*) показывает 4, каким образом я поместил int в 3 байта без ошибок? Компилятор MS Visual C++

Answer 1

Ваш код содержит неопределённое поведение (UB) - запись за границы выделенной памяти. От компилятора не требуется уведомлять о подобного рода ошибках. Подробнее об UB можете почитать в соответствующем вопросе: Разница между неопределённым, неспецифицированным и зависимым от реализации поведением

Answer 2

Этот код вызывает неопределенное поведение.

Ошибка не гарантируется, и эффект может быть любым (в том числе программа может работать как будто ничего не произошло, а может неожиданно сломаться).

READ ALSO
Есть ли отличия size_t от SIZE_T?

Есть ли отличия size_t от SIZE_T?

До сих пор везде использовал size_t, считая что это целочисленный тип, который адаптируется под разрядность операционной системы (4 байта - для...

130
signal.h в windows

signal.h в windows

Все источники говорят что, типы sigaction, sigset_t находятся в signalh Эта строчка у меня в самом верху присутствует:

159
Run-Time Check Failure #0 После записи указателя на метод класса

Run-Time Check Failure #0 После записи указателя на метод класса

Делаю колбэк на изменения размеров окна, и реагирования на изменение размера рендерераХорошо, объявил typedef, класс окна и класс рендерера...

157
Как связать dbcc_name из PDEV_BROADCAST_DEVICEINTERFACE и mount point?

Как связать dbcc_name из PDEV_BROADCAST_DEVICEINTERFACE и mount point?

После вставки носителя я получу сначала событие dbch_devicetype с deviceinterface, а затем с volume и если накопитель вставлялся 1, то очевидно оба события будут...

140