【发布时间】:2012-10-08 16:57:57
【问题描述】:
当动态分配包含 char 指针的结构时,实际的 char 指针会发生什么情况?它存储在哪里?
一旦结构体被释放,char指针是否也随之释放?
例如考虑以下结构:
struct mix
{
int a;
float b;
char *s;
};
typedef struct mix mix;
然后是为它分配内存的以下代码:
int main()
{
mix *ptr = (mix*)malloc(sizeof(mix));
ptr->a = 3;
ptr->b = 4.5f;
ptr->s = "Hi, there, I'm just a really long string.";
free(ptr);
return 0;
}
*s 是否在堆栈上分配,然后与*ptr 一起释放?我可以想象它确实是在堆栈上分配的,因为它不是以任何方式动态分配的(除非 malloc 有一些我不知道的功能)。我猜想*s 的“超出范围”将是释放*ptr 的时候。还是我完全错了? :)
非常感谢!
【问题讨论】:
-
根据 C 标准,您不应该知道东西在哪里。自动变量管理发生......自动。使用
malloc()动态分配的东西,co 是free()'d。如果你正确使用它们,你会得到有效的指针,这就足够了。为什么你想知道东西在哪里? -
@AlexeyFrunze 这甚至都不是那个的复制品,而且您之前的评论完全无法理解或解决 OP 的误解。
-
@AlexeyFrunze 当你进行编程时,你最终会遇到一种叫做调试的东西。它是一种故障排除形式,使用称为调试器的特定程序,指定以受控形式运行您的程序。调试时,您将需要寻找特定的常见错误,例如动态内存泄漏、堆栈溢出、由不正确的指针地址导致的代码失控、数组越界访问……等等。如果您不知道变量在内存中的分配位置,则无法使用调试器找到这些错误。当您尝试一个时,您会注意到这一点。
-
我的错,对不起。我自己也使用调试器,没问题。
标签: c struct dynamic-memory-allocation