gpt4 book ai didi

c - 重新分配原始数组后,数组元素会发生什么?

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

#include <stdio.h>
#include <stdlib.h>

int main()
{

int *a;
a = (int *)malloc(100*sizeof(int));
int i=0;


for (i=0;i<100;i++)
{
a[i] = i+1;
printf("a[%d] = %d \n " , i,a[i]);
}

a = (int*)realloc(a,75*sizeof(int));

for (i=0;i<100;i++)
{
printf("a[%d] = %d \n " , i,a[i]);
}

free(a);

return 0;

}

在这个程序中,我希望程序给我一个段错误,因为我试图访问使用 realloc() 释放的数组元素。但是除了一些最终元素之外,输出几乎是相同的!

所以我怀疑内存是否真的被释放了?到底发生了什么?

最佳答案

realloc 的工作方式是保证 a[0]..a[74] 在 realloc 之后具有与之前相同的值。

但是,当您尝试在重新分配后访问 a[75] 时,您会得到 undefined behaviour 。这意味着程序可以自由地以任何它喜欢的方式运行,包括段错误、打印出原始值、打印出一些随机值、根本不打印任何内容、发动核打击等。 没有任何要求使其出现段错误。

So my doubt is whether the memory is actually getting freed?

绝对没有理由认为 realloc 在这里没有发挥作用。

What exactly is happening?

最有可能的是,通过缩小原始内存块而不是清除现在未使用的最后 25 个数组元素来释放内存。结果,未定义的行为在打印原始值时表现出来。值得注意的是,即使对代码、编译器、运行时库、操作系统等进行最细微的更改,也可能使未定义的行为以不同的方式表现出来。

关于c - 重新分配原始数组后,数组元素会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26094253/

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