C函数返回局部变量

#include <stdio.h>
#include <stdlib.h>

int add(int a, int b) {
  int c = a+b;
  return c;
}

int main(int argc, char ** argv) {
  int a = add(1, 2);
  printf("%d\n", a);
  return 0;
}

这里的c不是局部变量吗, 为什么还能从add函数返回呢?求教!
我的理解局部变量在函数调用结束后就会被释放, 比如下面这段代码:

#include <stdio.h>
#include <stdlib.h>

char *int_2_str(int value) {
  char buf[20];
  sprintf(buf, "%d", value);
  return buf;
}

int main(int argc, char ** argv) {
  char *buf = int_2_str(1024);
  printf("%s", buf);
  return 0;
}

编译器就会给出警告:

warning: address of stack memory associated with local variable 'buf' returned

阅读 12.6k
4 个回答
int add(int a, int b) {
  int c = a+b;
  return c;
}

這沒有問題, add返回的只是局部變量的值

char *int_2_str(int value) {
  char buf[20];
  sprintf(buf, "%d", value);
  return buf;
}

這樣是危險 (但仍然合法) 的. int_2_str返回的是一個局部變量的地址, 而這個地址在函數結束後已經不知道是什麼內容了, 讀寫這個地址在大部分情況下沒意義且危險.

C语言中return返回值的机制为将返回值存入eax寄存器中,然后系统再将eax中的值赋给接收变量

add函数返回的是数据,是int类型的,并不是返回变量

在main()函数调用add()或者int_2_str()时,在main()函数的stack frame中会有一个位置用于存储add()或者int_2_str()的返回值。
所以说,不管这是什么函数,我们一定会得到返回的值,只是对于int_2_str()来说,因为这个值是int_2_str()的stack中的地址,int_2_str()返回后这个地址的内容就无效了,因此这么做会有警告。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进