c -如何限制分配的内存大小



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

代码如下:

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

首先,请参阅关于为什么不在C中强制转换malloc()和family的返回值的讨论。

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

最后是

我为一个2位数的int[…]分配内存

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

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

对此,引用C11

void *malloc(size_t size);

malloc函数为大小由size[…]指定的对象分配空间

因此,这里,malloc()返回一个指针,其大小为两个整数(即能够保存两个整数值),而不是两个数字字节

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

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

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

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

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

为2位int

分配内存

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

  1. 你一开始就不需要cast

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

  3. 你给了一个指针值123456

或许再读一遍这本书

相关内容

  • 没有找到相关文章

最新更新