更改存储值后修改了 malloc 大小?

malloc size modified after changing stored value?

我有一个程序使用 malloc 为我的程序分配一个 void 类型的 space 我传递给 malloc 的值是 1,所以它应该分配 1 个字节。

现在我将指针转换为 int 并将其值修改为 int(例如 280)。 我很确定一个 int 需要 4 个字节的内存来存储,而且我知道一个事实 280至少用2个字节表示

我的期望是,因为我只有一个 1 字节大小的指针,所以整个整数 不适合那个 space,我以为会有错误什么的(有 none) 然后我认为整数从指针开始存储到RAM并超过分配的内存,因为我会打印分配内存的指针

我应该得到一个代表数字的第一个字节的值(在本例中:24)

但是:

当我尝试打印指针的值时,该值仍然是 280

现在我在想的是程序以某种方式自动为该指针分配了更多大小

但我也觉得这很奇怪,谁能解释一下这里发生了什么?

我也想知道如何只存储 280 的第一个字节。

#include <iostream>

int main() {
  void* p = malloc(1); // This should allocate 1 byte
  *(int*)p = 280; // This should cast p to an integer, dereference it and set value to 280
  std::cout << *(int*)p << std::endl; // This prints 280 but I think it should print 24
  free(p);
}

上面是一个伪代码,应该做我做的 class 做的事情,而不是发送整个 class 我只是将构造函数,operator=,析构函数替换为它们的实际代码

编辑:

我正在使用 mingw32-g++ 编译应用程序

gcc 版本 6.3.0 (MinGW.org GCC-6.3.0-1)

Malloc 只分配一个字节,但没有机制来避免您在其他内存地址上写入,通过在 p 的地址中写入 4 个字节,您写入分配的字节 + 3 个其他连续字节。 之后,当您引用指针时,您会读取 4 个与您刚刚写入的字节相同的字节。 你正在做的是在程序可能没有使用的内存上写入和读取,但这是未定义的行为,你不应该这样做,因为它会导致分段错误。