多年后开始重新学习C,我有点困惑为什么我正在做的事情正在发挥作用:
char *test_foo() {
char *foo = "foo";
return foo;
}
int main(int argc, char *argv[])
{
char *foo = test_foo();
printf(foo);
return 0;
}
也许我误解了我的书,但我的印象是在test_foo
函数中初始化的字符指针应该在函数返回后释放其内存块,这应该使我的{{1}不像在这个例子中那样打印出“foo”。
这只是内核没有及时释放这个内存的情况,还是我误解了为什么会发生这种情况?
答案 0 :(得分:4)
在C中,字符串文字是具有静态存储持续时间的常量字符的匿名数组。当周围函数返回时,不会释放字符串文字的内存。指针foo
的内存是,但它的值在释放之前被复制到调用者。你正在做的事情是非常明确和明智的。
答案 1 :(得分:4)
你最终会返回一个指向文字的指针(" foo")
您的代码与
相同char *test_foo() {
return "foo";
}
但请注意,你做了一个错误的假设。你认为是因为你的代码打印了#34; foo"你所做的一切都很好(在这种情况下是这样),但即使在“坏”的情况下也是如此。例如,你的代码很多次会在一个简单的测试中成功,但在一个更真实的例子中爆炸。
要查看您希望尝试的案例
char *test_foo() {
char foo[10];
strcpy(foo,"foo")
return foo;
}
现在你的字符串在堆栈中,将在函数出口
释放答案 2 :(得分:2)
它起作用的原因是因为foo()
返回一个指向初始化数据的指针 - 一个字符串文字。该字符串数据不在本地堆栈上,因此foo()
返回的指针很好。