gpt4 book ai didi

c - 我的 malloc 函数分配的比我打算的多吗

转载 作者:行者123 更新时间:2023-12-02 06:14:56 25 4
gpt4 key购买 nike

这是我要运行的代码。 malloc 函数分配 800 个字节。

void DynamicMemoryAllocationUsingMalloc()
{
int* p,i;
if((p = (int*) malloc(800)) == NULL)
{
printf("\n Out of Memory \n");
exit(0);
}

for(i =0;i < 800;i++)
{
printf(" 0x%x", (p + i));
printf(" %d\n", *(p + i));

}
}

但是在 for 循环中,当我打印地址时,我能够安全地跳转 800 个内存位置(使用整数指针 p),每个 4 字节长(整数大小),相当于3200 字节。这怎么可能,或者我很幸运没有出现访问冲突错误,即使我实际上进入了一个我还没有为我的程序分配的内存区域?我看到所有内存位置都写入了垃圾,原因很明显,因为我没有将这些内存位置设置为任何内容。

注意:这是一个在Windows 7上运行的C程序。

最佳答案

How is that possible or I'm being lucky not be getting access violation error even though I'm actually entering into a memory area which I've not yet allocated for my program?

当代码到达 printf("%d\n", *(p + 200)); 时,它正在尝试读取外部分配的内存。那是未定义的行为 UB。

UB 就是 UB。它可能每天都这样发生,或者在你下次运行时改变。


你运气不好。幸运的是您的代码就此停止。

即使读取未初始化的 int 数据也是 UB。所以一旦 printf("%d\n", *(p + 0));,代码就有了 UB(或者可能定义了实现)。 IAC,代码本可以就此停止。


Is my malloc function allocating more than I intend to?

这是棘手的一点。调用 UB 的代码会产生有问题的结果。没有 UB 的代码没有测试问题的标准方法。确定这一点的唯一非 UB 方法是库是否提供具有答案的函数。

printf("True size %lu\n", (unsigned long) True_size(p));

注意:OP 断言 int 是 4 个字节。

关于c - 我的 malloc 函数分配的比我打算的多吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com