如果函数的返回值类型是一个函数内部变量的指针, 这种操作是否安全?

来源:7-6 指针参数作为返回值【通过汇编了解函数返回值机制】

慕用6042400

2024-01-26

老师, 您好。
如果我们函数返回的返回值是指针, 这种操作是否安全?比如下面的例子:

__int128 LongReturnValue(){
  __int128 result = 1;
  return result;
}

__int128 * LongReturnValue2(){
  __int128 result = 1;
  __int128 *p = &result;
  return p;
}

int main(){
  __int128 a1 = LongReturnValue();// 返回的值, 超过64位(当前系统是64位),则需要用两个寄存器拷贝结果。

  __int128 *a2 = LongReturnValue2(); // 如果返回指针, 则指针的长度只有64位, 所以只需要一个寄存器拷贝即可。

  if(a2){
    printf("%#llx",*a2);
  } else{
    PRINT_STRING("返回的指针是空的");
  }

  return 0;
}

这里例子的执行结果看, 的确拿到了__int128的返回值, 并且也只需要一个寄存器拷贝, 因为指针长度是固定的。 但是, 函数执行完以后, 局部变量的内存空间会释放,是否意味着, main函数中拿到的指针, 是一个野指针?

写回答

1回答

bennyhuo

2024-01-26

没错,是野指针。局部变量的存储期就是函数内部。
0
1
慕用6042400
非常感谢!
2024-01-26
共1条回复

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程