从C中的函数返回局部变量

从C中的函数返回局部变量

#include <stdio.h>int foo1(void){
    int p;
    p = 99;
    return p;}char *foo2(void){
    char buffer[] = "test_123";
    return buffer;}int *foo3(void){
    int t[3] = {1,2,3};
    return t;}int main(void){
    int *p;
    char *s;

    printf("foo1: %d\n", foo1());
    printf("foo2: %s\n", foo2());
    printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]);
    return 0;}

当我用gcc -ansi -pedantic -W -Wall编译器为foo 2()和foo 3()发出警告消息:

warning: function returns address of local variable

我认为它不允许返回局部变量,但是foo 1()工作得很好,返回指向本地对象的指针与对象本身似乎有很大的区别。

有人能说明一下这个问题吗?提前谢谢!


慕的地6264312
浏览 603回答 3
3回答

跃然一笑

这里的问题是,当您创建局部变量时,它在堆栈上分配,因此在函数完成执行后不可用(这里的实现有所不同)。最好的方法是使用malloc()保留非本地内存。这里的危险是你必须交易(free())使用malloc(),如果您忘记了,则会造成内存泄漏。

偶然的你

为foo1(),您返回一个复制局部变量,而不是局部变量本身。对于其他函数,可以返回指向局部变量的指针的副本。但是,当函数结束时,局部变量将被解除分配,因此,如果以后尝试引用它,最终会出现一些棘手的问题。

SMILET

任何变量在内存中都有一些空间。指针引用该空间。当函数调用返回时,局部变量占用的空间将被取消分配,这意味着它可以并且将被重用于其他事情。因此,对那个空间的引用最终会指向完全不相关的东西。C中的数组是作为指针实现的,因此这将最终应用于它们。函数中声明的常量数组也算作本地数组。如果要在创建数组的函数的作用域之外使用数组或其他指针,则需要使用malloc为其保留空间。使用malloc保留的空间在通过调用空闲显式释放之前不会重新分配或重用。
打开App,查看更多内容
随时随地看视频慕课网APP