如何限制分配内存的大小?
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 语言中没有办法确保你的程序不会写入超过它分配的内存的末尾。您的程序有责任不这样做,包括它必须执行的任何检查以捕获潜在的不安全访问。
这称为未定义行为。当您访问超过分配区域末尾的内存时,系统可能会崩溃,但它不必如此。
你一开始就不需要强制转换
你被分配了两个整数的内存——通常每个 32 位
- 您给指针赋值 123456
也许再读一遍这本书
在研究指针时,我发现如果我为一个 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 bysize
[...]
所以,在这里,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 语言中没有办法确保你的程序不会写入超过它分配的内存的末尾。您的程序有责任不这样做,包括它必须执行的任何检查以捕获潜在的不安全访问。
这称为未定义行为。当您访问超过分配区域末尾的内存时,系统可能会崩溃,但它不必如此。
你一开始就不需要强制转换
你被分配了两个整数的内存——通常每个 32 位
- 您给指针赋值 123456
也许再读一遍这本书