如何限制分配内存的大小?

How to limit the size allocated memory?

在研究指针时,我发现如果我为一个 2 位数的 int 分配内存,我可以为该 int 赋予更高的值。有人可以向我解释为什么它会这样工作以及如何解决它吗?

代码如下:

int *p;

p = (int *) malloc(2*sizeof(int));
p = 123456;

allocate memory for a 2 digit int

malloc(2*sizeof(int)) 两个整数 分配内存,而不是为 单个两位整数 .

分配内存

首先,Please see this discussion on why not to cast the return value of malloc() and family in C..

就是说,在这里,您只是覆盖了 malloc() 返回的指针。不要那样做。会造成内存泄漏。此外,如果您稍后尝试取消引用此指针,您可能会面临 undefined behavior,因为无法保证此指针指向 有效 内存位置。访问无效内存导致UB。

最后,要解决

I allocate memory for a 2 digit int [...]

让我告诉你,你正在分配内存来容纳两个 整数 ,而不是 两位整数 。此外,要将整数值 存储到 指针指向的内存区域,您需要取消引用指针,如 *p 并将值存储(分配)在那里,如 *p=12345;.

malloc() 分配作为参数传递的 字节 大小的内存。检查sizeof(int)2*sizeof(int),如果你想)使它更清楚。

对此,引用 C11 章节

void *malloc(size_t size);

The malloc function allocates space for an object whose size is specified by size [...]

所以,在这里,malloc() returns 一个大小为两个整数的指针(即,能够保存两个整数值),而不是两个 数字字节.

此外,在使用返回的指针之前检查 malloc() 是否成功始终是一个好习惯,以避免在 malloc() 失败的情况下通过取消引用 NULL 来避免可能的 UB。

if i allocate memory for a 2 digit int i can give that int a higher value.

不,你不能。您已经为两个 int 分配了内存,具有完整的 int 范围。标准保证至少五位数字 (215-1),但在大多数现代系统中,八位数字 (231-1) 是安全的.

回到你的问题,在 C 语言中没有办法确保你的程序不会写入超过它分配的内存的末尾。您的程序有责任不这样做,包括它必须执行的任何检查以捕获潜在的不安全访问。

这称为未定义行为。当您访问超过分配区域末尾的内存时,系统可能会崩溃,但它不必如此。

  1. 你一开始就不需要强制转换

  2. 你被分配了两个整数的内存——通常每个 32 位

  3. 您给指针赋值 123456

也许再读一遍这本书