【问题标题】:Decayed array and memory deallocation衰减数组和内存释放
【发布时间】:2014-09-27 08:05:16
【问题描述】:

关于数组衰减为指针的内存“行为”,我一直在摸不着头脑。

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

阅读这种代码,我会说指针应该在第一个函数的末尾无效(因为没有执行 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
}

【问题讨论】:

  • 请贴出相关代码。 “没有显式内存分配”不是描述 C 实现的有用方式。
  • 听起来数组是自动存储持续时间?如果是这样,是的,指针变得无效。在数组的生命周期结束后访问它是未定义的行为。
  • 检查这个。 stackoverflow.com/questions/408670/stack-static-and-heap-in-c。数组必须在某个地方...
  • stackoverflow.com/questions/6441218/… 很好地解释了当您尝试访问其范围之外的局部变量时发生的情况。
  • 很可能是因为您没有发布任何代码。

标签: c arrays memory memory-management memory-leaks


【解决方案1】:

我会说指针应该在第一个结束时失效 函数(因为没有做 malloc)但它不是。

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

但是,在该指针上调用 free() 会引发 glibc 错误:无效指针。有道理,因为没有调用 malloc。

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

由于数组衰减,是否正在执行一些隐式内存分配?

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

有没有办法在这之后正确释放内存?

内存在第一个函数结束时被“释放”;除了存储它的地址之外,什么都不需要做。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 2011-11-14
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多