【问题标题】:Returning local variable from a function [duplicate]从函数返回局部变量[重复]
【发布时间】:2015-08-11 23:13:44
【问题描述】:

在下面的代码中,我返回一个指向在函数内部本地创建的char 数组的指针。所以当返回值赋值给y时,应该都是垃圾。当我打印%10s%100s 时,这似乎成立。但是当我打印%1000s 时,我得到的输出似乎让我感到困惑。

#include <stdio.h>

char* get()
{
  char x[1000] ;

  int i = 0;
  for(; i < 999; ++i)
  {
    x[i] = 'A';
  }

  x[999] = '\0';

  printf("%1000s\n",x);

  return x;
  }

  int main()
  {
    char* y = get();
    printf("Going to print\n");
    printf("%1000s\n",y);
  }

输出是

main() 函数正在访问用于创建本地函数 char 数组的同一内存位置是巧合还是更具体?

【问题讨论】:

  • 您在调用未定义行为时所做的任何假设都是没有意义的。这就是未定义行为的本质;没有没有定义。所以,你一开始的“应该都是垃圾”的前提本身就是把握了信念的飞跃。见stackoverflow.com/questions/6441218/…
  • 为什么不呢,char x[1000] = {0}; 然后声明char *get (char *x) 最后调用char *y = get (x);

标签: c function return local-variables


【解决方案1】:

你看,一旦你使用get()的返回值,你将面对undefined behaviour

在那之后,就没有任何保证了。

换句话说,printf("%1000s\n",y);## 语句的输出不能证明。它它是什么。不明确的。

FWIW,一旦 get()function 完成执行,分配给该函数的堆栈空间将被销毁并可供任何其他函数使用(如果需要) .也许你正在未经授权地进入物理内存的那部分,但不确定。


## - 或者,printf("%10s\n",y);printf("%100s\n",y);,无论在哪里访问了 y

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2013-08-16
    • 2016-01-19
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多