C 使用类似代码时出现奇怪的编译器抱怨

C 使用类似代码时出现奇怪的编译器抱怨,c,compiler-errors,user-input,C,Compiler Errors,User Input,对于一个项目,我必须要求用户提供一个文件名,我正在使用getchar逐字读取它 在main中,我调用函数char*coursename=introPrint()//开始打印使用说明并获取第一位输入。该函数定义为 char *introPrint(){ int size= 20; int c; int length=0; char buffer[size]; //instructions printout, cut for brevity //get coursena

对于一个项目,我必须要求用户提供一个文件名,我正在使用
getchar
逐字读取它

在main中,我调用函数
char*coursename=introPrint()//开始
打印使用说明并获取第一位输入。该函数定义为

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,然后打印结果。然而,在这里,我得到了一个
函数,它为return语句返回局部变量的地址。那么,为什么我没有收到来自另一个程序的警告,而是为此代码触发了一个警告?

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


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

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


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

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


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

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


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

因为在这里,您实际上返回指向本地(函数作用域)变量的指针:
char缓冲区[大小]

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

要解决此问题,应使用
malloc
动态分配阵列:

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

因为在这里,您实际上返回指向本地(函数作用域)变量的指针:
char缓冲区[大小]

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

要解决此问题,应使用
malloc
动态分配阵列:

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

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


问题是,当函数返回时,所有局部变量都会被销毁。这意味着返回的指针不再指向任何地方。没有缓冲区。不好

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


问题是,当函数返回时,所有局部变量都会被销毁。这意味着返回的指针不再指向任何地方。没有缓冲区。不好

当您声明char buffer[]时,它会将该缓冲区放在堆栈上。当函数退出时,堆栈弹出,缓冲区停止存在。如果要返回动态缓冲区,请调用malloc()(或windows中的GlobalAlloc(),或者可以选择在c++中使用新运算符)


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

当您声明char buffer[]时,它会将该缓冲区放在堆栈上。当函数退出时,堆栈弹出,缓冲区停止存在。如果要返回动态缓冲区,请调用malloc()(或windows中的GlobalAlloc(),或者可以选择在c++中使用新运算符)


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

有道理。除了生成全局变量,还有其他选择吗?\n有。分配内存或使用静态缓冲区。或者只在introPrint函数的调用程序中声明缓冲区,并将指向它的指针传递给introPrint函数。第三种方法是将buffer+len传递给函数。请注意,使用静态缓冲区是不可重入的。在任何情况下,您都应该清楚地记录缓冲区的所有权。除了生成全局变量,还有其他选择吗?\n有。分配内存或使用静态缓冲区。或者只在introPrint函数的调用程序中声明缓冲区,并将指向它的指针传递给introPrint函数。第三种方法是将buffer+len传递给函数。请注意,使用静态缓冲区是不可重入的。在任何情况下,您都应该清楚地记录缓冲区的所有权。