关于记忆和行为,我一直在摸不着头脑。数组作为指针衰减。
我有一个函数,在函数中创建一个结构数组(没有显式内存分配),然后作为指针传递给另一个函数。所述函数将指针存储在静态变量中。
读这种代码,我会说指针应该在第一个函数的末尾无效(因为没有完成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
}
答案 0 :(得分:1)
我想说指针应该在第一个结尾处失效 函数(因为没有完成malloc)但它不是。
是的,但是,C中的“无效”只意味着后续行为未定义......任何事情都可能发生,包括您的程序看起来完美无缺。
但是,在此指针上调用free()会引发glibc错误:指针无效。这是有道理的,因为没有调用malloc。
事实上,因为没有调用malloc,所以这是有意义的。你只能释放被malloced的内存;释放不是未定义行为的内存,在这种情况下,库足以产生诊断。
是否因为衰减数组而执行了一些隐式内存分配?
没有“腐朽阵列”这样的东西。数组不是C中的第一类对象,因此它们不能传递给函数......只有它们的地址才可以。 “decay”只包含在表达式上下文中使用时转换为指向数组第一个元素的指针的数组的名称......这是编译时的事情。
有没有办法在此之后正确释放内存?
在第一个函数结束时“释放”了内存;除了不存储其地址外,别无其他需要做的事。