在研究指针时,我发现如果我为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))
为两个整数分配内存,不为单个两位整数分配内存。
-
你一开始就不需要cast
-
为两个整数分配内存,每个整数通常为32位
- 你给了一个指针值123456
或许再读一遍这本书