在研究指针时,我发现如果我为2位数字分配内存,我可以给int更高的值。有人可以解释一下为什么它会这样工作以及如何解决它?
以下是代码:
int *p;
p = (int *) malloc(2*sizeof(int));
p = 123456;
答案 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)
您首先不需要演员
为两个整数分配内存 - 通常为32位
也许重读这本书