【发布时间】: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