c - 局部变量的返回值。哪一个是不好的做法?

标签 c return-value scope

我的代码如下

main(){
  int *a;
  a = fun1():
  printf("%d",&a);
}

我的乐趣1是

int* fun1(){
  int a = 10;
  return &a;
}

另一个版本是

int* fun1(){
  int* a = malloc(sizeof(int));
  *a = 10;
  return a;
}

现在,我猜测在第一个函数中,当我在函数中执行 int a = 10 时,它将创建一个局部变量 a。如果我尝试将该变量的地址传递到函数外部,它将超出范围,因此当我再次从 main 中引用它时,我将得到垃圾值。

但是在第二种情况下,因为指针是局部变量,所以当我返回它时,我得到了地址的副本,但是因为我现在有了地址,(即使在与它在内部的不同位置fun1()),我可以从 main 引用它。

是吗?我的理解正确吗?

此外,如果不是返回指向 int 的指针,而是返回 int。

int fun(){
  int a = 10;
  return a;
}

在 main 函数中,我只打印这个返回值的值,这样它就可以正常工作了吗?

谢谢

最佳答案

第一个是不好的做法,会导致各种问题。

如果函数的用户忘记释放指针,第二个就会出现问题。

第三个是最佳选择,因为没有任何问题。

如果你需要传回一个更大的数据结构,传递一个指向它的指针作为参数,并获取函数来填充它。

关于c - 局部变量的返回值。哪一个是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26553558/

相关文章:

iphone - 实例变量在iOS应用程序中未保留值

C + 图形用户界面 + Mac 操作系统

c - Raspberry Pi 客户端到 Mac 服务器错误

linux - 如何从 system() 获取自定义返回值

C++ 返回的指针指向函数返回的内容以外的内容

ruby-on-rails - 如何在 Rails Admin 中显示无作用域模型?

python - 范围规则的简短描述

c - 原始套接字 : sendto() and recvfrom() not working

c - qsort 在使用 "a > b"作为比较器时意外工作

c# - 如何正确捕获调用存储过程的返回值