【发布时间】:2018-09-04 21:50:23
【问题描述】:
我试图弄清楚在缓冲区末尾附近写入一块内存是否会溢出,但我遇到了一个奇怪的问题,我猜这是由于对指针类型如何工作的一些误解。
鉴于这段代码,它只是分配内存并尝试在它的最后写入:
#include <Windows.h>
#include <stdint.h>
int main() {
size_t size = 19200;
int16_t* start = (int16_t*) VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
int16_t* end = start + size;
int16_t* writeToEnd = end - sizeof(int16_t);
*writeToEnd = 1;
return 0;
}
我在writeToEnd 收到非法写入异常。但是,如果我将所有内容都更改为 int:
#include <Windows.h>
#include <stdint.h>
int main() {
size_t size = 19200;
int* start = (int*) VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
int* end = start + size;
int* writeToEnd = end - sizeof(int);
*writeToEnd = 1;
return 0;
}
一切正常。我会理解某些值是否会导致int16_t-type 溢出,但是通过手动检查所有值,一切似乎都正常。
Visual Studio 内存窗口显示可用内存小于 end 计算的内存。
我误会了什么?不应该pointer + size == endOfBuffer,不管使用什么类型?
【问题讨论】:
标签: c pointers memory allocation