使用类似代码时出现奇怪的编译器投诉

时间:2011-03-20 16:03:32

标签: c compiler-errors user-input

对于一个项目,我必须要求用户提供一个文件名,并且我正在逐个字符地使用getchar来阅读它。

从主要方面,我调用函数char *coursename= introPrint(); //start off来打印使用方向并获得第一位输入。该功能定义为

char *introPrint(){
  int size= 20;
  int c;
  int length=0;
  char buffer[size];


  //instructions printout, cut for brevity

  //get coursename from user and return it
  while ( (c=getchar()) != EOF && (c != '\n') ){
    buffer[length++]= c;
    if (length==size-1)
      break;

  }
  buffer[length]=0;
  return buffer;
}

这基本上与我写的要求用户输入的代码完全相同,用星号替换字符echo,然后打印出结果。但是,在这里,我收到了返回语句的function returns address of local variable警告。那么为什么我没有收到其他程序的警告,而是触发一个代码?

5 个答案:

答案 0 :(得分:3)

您将返回buffer的地址,该地址在超出范围时(函数返回时)将被销毁。当您尝试使用返回的指针时,程序的行为是未定义的:程序可能会重用buffer实例之前用于其他目的的内存。

使用static缓冲区,使用malloc分配一个缓冲区,或让调用者通过缓冲区。在最后一种情况下,函数及其调用者还需要以某种方式通过缓冲区的长度进行通信(例如,通过额外的参数size)。

答案 1 :(得分:1)

警告告诉您在函数内部有堆栈内存(对于缓冲区对象),因此不应从外部访问它。根据环境的不同,当您想要使用时,用于保存输入的内存可能会被其他数据覆盖。

最好为coursename定义分配内存,然后将指针传递给函数或动态分配缓冲区内存。

答案 2 :(得分:1)

因为在这里,你真的返回指向本地的指针(对于函数的作用域)var:
char buffer[size];

因此,在执行该函数之后,该数组将被销毁并且指针无效并且您将获得未定义的行为。

要解决此问题,您应该使用malloc动态分配数组:

char* buffer = (char*)malloc( size * sizeof( char ) );

答案 3 :(得分:0)

只是猜测你没有在另一个函数中返回指向缓冲区的指针。

问题是函数返回时会破坏所有局部变量。这意味着返回的指针不再指向任何地方。没有缓冲区。不好!<​​/ p>

答案 4 :(得分:0)

当你声明char buffer []时,它将该缓冲区放在堆栈上。当函数退出时,将弹出堆栈并且缓冲区不再存在。如果要返回动态缓冲区,请在windows中调用malloc()(或GlobalAlloc(),或者在c ++中使用new运算符)。

static关键字将导致缓冲区存在于堆栈外部,基本上与全局相同,只能在函数外部访问。