将值返回到函数中初始化的指针

时间:2015-11-30 18:43:21

标签: c

多年后开始重新学习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”。

这只是内核没有及时释放这个内存的情况,还是我误解了为什么会发生这种情况?

3 个答案:

答案 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()返回的指针很好。