gpt4 book ai didi

c - 衰减数组和内存释放

转载 作者:行者123 更新时间:2023-11-30 15:31:04 25 4
gpt4 key购买 nike

我一直对数组作为指针衰减的内存“行为”感到摸不着头脑。

我有一个函数,其中在函数中创建结构数组(没有显式内存分配),然后作为指针传递给另一个函数。该函数将指针存储在静态变量中。

阅读此类代码,我会说指针应该在第一个函数末尾无效(因为没有完成 malloc),但事实并非如此。但是,在此指针上调用 free() 会引发 glibc 错误:无效指针。这是有道理的,因为没有调用 malloc。

  • 是否由于数组衰减而执行了一些隐式内存分配?
  • 在此之后有没有办法正确释放内存?我知道简单的答案是自己分配内存,我主要是出于好奇而问。

编辑:根据要求提供一些虚拟代码:

static structure* s_array = NULL;

void foo()
{
structure array[5];
bar(array); // array decaying as a pointer
}

void bar(structure* ptr)
{
s_array = array; // pointer stored in the static, not invalidated at the end of foo()
}

void freeBar()
{
free(s_array); // invalid pointer
}

最佳答案

I would say the pointer should be invalidated at the end of the first function (since no malloc was done) yet it is not.

是的,确实如此,但 C 语言中的“无效”仅意味着后续行为未定义……任何事情都可能发生,包括您的程序看起来运行良好。

However, calling a free() on this pointer throws a glibc error : invalid pointer. Makes sense, since no malloc was called.

这确实是有道理的,因为 malloc 没有被调用。您只能释放已分配的内存;释放未释放的内存是未定义的行为,在这种情况下,库足够友善地生成诊断。

Is there some implicit memory allocation being performed because of the decaying array ?

不存在“腐烂数组”这样的东西。数组不是 C 中的第一类对象,因此它们不能传递给函数……只有它们的地址可以。 “衰减”仅由在表达式上下文中使用时转换为指向数组第一个元素的指针的数组名称组成……这是编译时的事情。

Is there a way to properly free the memory after this ?

内存在第一个函数结束时被“释放”;除了存储其地址之外,不需要做任何其他事情。

关于c - 衰减数组和内存释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125629/

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