在C语言中返回一个局部变量

在C语言中返回一个局部变量,c,local-storage,C,Local Storage,最近我在stackoverflow上读到一个线程,无论是指针类型还是普通变量,都必须避免返回局部变量。我在C语言书中看到一个例子,它返回一个局部变量,所以我想再试一次 #include <stdio.h> int func(int a, int b) { int d, e, f; d = a; e = b; f = d+e; return f; } int main(void) { int c = func(1, 2); pri

最近我在stackoverflow上读到一个线程,无论是指针类型还是普通变量,都必须避免返回局部变量。我在C语言书中看到一个例子,它返回一个局部变量,所以我想再试一次

#include <stdio.h>
int func(int a, int b)
{
    int d, e, f;
    d = a;
    e = b;
    f = d+e;
    return f;
}
int main(void)
{
    int c = func(1, 2);
    printf("hello\n");//I put this printf in between
    printf("c = %d\n", c);//here c should be overwritten
    return 0;
}
#包括
int func(int a,int b)
{
int d,e,f;
d=a;
e=b;
f=d+e;
返回f;
}
内部主(空)
{
int c=func(1,2);
printf(“hello\n”);//我把这个printf放在
printf(“c=%d\n”,c);//此处应覆盖c
返回0;
}
在该线程中,有人说,如果我在函数调用和访问该变量之间放置任何东西,我将丢失该值

无论我做什么,我都能够访问局部变量,但我记得我根据该线程编写了一个示例,并且显示了与所述相同的行为


我遗漏了什么?

你提到的未命名线程误导了你

在您的示例中,func()返回一个整数。返回整数总是安全的,不管它来自何处

值(int、char、double)从不共享。每次传递/返回它们时,都会传递/返回该值的副本,因此是安全的


指针(int*、char*、double*)可以共享它们所指向的内存位置。传递/返回它们可能是危险的,因为该内存位置的值会随时间而变化。你必须小心指针。

你提到的未命名线程误导了你

在您的示例中,func()返回一个整数。返回整数总是安全的,不管它来自何处

值(int、char、double)从不共享。每次传递/返回它们时,都会传递/返回该值的副本,因此是安全的


指针(int*、char*、double*)可以共享它们所指向的内存位置。传递/返回它们可能是危险的,因为该内存位置的值会随时间而变化。你必须小心使用指针。

这是与书中所说的完全相同的代码吗?否则,这是正常行为,因为您已经使用“c”在main中保存函数的返回值。你可以在赋值后读取它的值。返回局部变量的值是可以的。。。返回指向局部变量的指针不是(除非它是静态的,并且您知道其后果)。相关问题:我认为局部变量返回的那一刻,它就被破坏了,因此它将是未定义的行为。当您返回局部变量的值时,您可以有效地将值从局部变量复制到指定返回值的任何位置。因此,一旦函数返回,就不能使用指向局部变量本身的指针,但可以使用它的值(在返回时),通过返回复制到另一个变量。这是与书中所说的完全相同的代码吗?否则,这是正常行为,因为您已经使用“c”在main中保存函数的返回值。你可以在赋值后读取它的值。返回局部变量的值是可以的。。。返回指向局部变量的指针不是(除非它是静态的,并且您知道其后果)。相关问题:我认为局部变量返回的那一刻,它就被破坏了,因此它将是未定义的行为。当您返回局部变量的值时,您可以有效地将值从局部变量复制到指定返回值的任何位置。因此,一旦函数返回,您就不能使用指向局部变量本身的指针,但您可以使用它的值(在返回时),通过返回复制到另一个变量。我猜当时的解释中缺少一些东西。可以复制局部变量,但不能复制局部指针。为什么?这是关于过程中的分割,一个区域的堆栈不能被堆栈中的另一个区域访问。所以返回这个本地指针值,但在调用方函数堆栈中的那个地址,垃圾或0将被设置。在执行malloc然后返回本地指针的情况下是可访问的,因为堆对于程序中的所有函数来说都是公共的。这并不是说一个函数是否可以访问另一个函数的堆栈空间——只是当函数返回时变量的生存期结束了(除非它是静态的),函数返回后,它所占用的区域可能会变得无效或被重新用于其他用途。例如,将指向局部变量的指针传递给函数是可以的,因为使用指针的函数调用发生在它所指向的变量的生命周期内,而不是在它结束后。我想当时的解释中缺少了一些东西。可以复制局部变量,但不能复制局部指针。为什么?这是关于过程中的分割,一个区域的堆栈不能被堆栈中的另一个区域访问。所以返回这个本地指针值,但在调用方函数堆栈中的那个地址,垃圾或0将被设置。在执行malloc然后返回本地指针的情况下是可访问的,因为堆对于程序中的所有函数来说都是公共的。这并不是说一个函数是否可以访问另一个函数的堆栈空间——只是当函数返回时变量的生存期结束了(除非它是静态的),函数返回后,它所占用的区域可能会变得无效或被重新用于其他用途。例如,可以将指向局部变量的指针传递给函数,因为使用指针的函数调用发生在它所指向的变量的生命周期内,而不是在它结束后。