对于一个项目,我必须要求用户提供一个文件名,并且我正在逐个字符地使用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
警告。那么为什么我没有收到其他程序的警告,而是触发一个代码?
答案 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关键字将导致缓冲区存在于堆栈外部,基本上与全局相同,只能在函数外部访问。