c - 从 C 函数返回局部变量

标签 c pointers local-variables

#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 编译它时编译器发出 foo2() 和 foo3() 的警告消息:

warning: function returns address of local variable

我认为不允许返回局部变量,但是 foo1() 工作正常,并且返回指向局部对象的指针和对象本身之间似乎存在巨大差异。

有人能解释一下这个问题吗?提前致谢!

最佳答案

这里的问题是,当您创建局部变量时,它会在堆栈上分配,因此一旦函数完成执行,它就不可用(此处的实现有所不同)。更好的方法是使用 malloc() 来保留非本地内存。这里的危险在于,您必须释放 (free()) 使用 malloc() 分配的所有内容,如果忘记,就会造成内存泄漏。

关于c - 从 C 函数返回局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55900671/

相关文章:

c - 如何在命令行中的某个字符串后捕获参数?

python - 在 Python 中按地址拆分字符串,就像在 C 中一样(Python 的字符串切片)

java - 局部变量同步,比同步方法更好?

C 具有可变大小行的二维数组

scope - Lua - 函数中的局部变量作用域

c - 这也是 C 语言中的灵活数组结构成员吗?

C - C/Arduino 中 printf 的 float 到 char 数组的内联转换

C 编程 - 质数检查

c++ - 如何使用 nullptr 初始化同一类对象的静态指针数组?

c - 在 C 中处理指向 2D 数组的指针时出现不稳定的行为