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

时间:2016-09-05 20:39:17

标签: c pointers malloc dynamic-memory-allocation

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

以下是代码:

int *p;

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

4 个答案:

答案 0 :(得分:4)

首先,here

那就是说,在这里,你只是覆盖malloc()返回的指针。不要这样做。它会导致内存泄漏。此外,如果您稍后尝试取消引用此指针,则可能会遇到Please see this discussion on why not to cast the return value of malloc() and family in C.,因为无法保证此指针指向有效内存位置。访问无效内存会导致UB。

最后,要解决

  

我为2位int [...]

分配内存

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

*p=12345;分配作为其参数传递的 bytes 大小的内存。查看malloc()sizeof(int),如果您需要)以使其更清晰。

关于此,引用2*sizeof(int),,章节

  

C11

     

void *malloc(size_t size);函数为大小由malloc指定的对象分配空间[...]

所以,在这里,size返回一个大小为两个整数的指针(即能够容纳两个整数值),而不是两个数字字节

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

答案 1 :(得分:2)

  

如果我为2位数字分配内存,我可以给该int一个更高的值。

不,你不能。您已为两个int分配了内存,其中int范围为template <class T> class Wrapper { T _t; }; 。标准保证至少五位数(2 15 -1),但在大多数现代系统中,您可以安全地使用八位数(2 31 -1)。

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

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

答案 2 :(得分:0)

  

为2位数字分配内存

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

答案 3 :(得分:-1)

  1. 您首先不需要演员

  2. 为两个整数分配内存 - 通常为32位

  3. 您正在给指针值123456
  4. 也许重读这本书