Visual Studio c ++显示第24行的“string”有一个数组元素,但top包含用户输入的所有文本。但是当我发送到PutString()时,它就消失了。为什么呢?
#include <stdio.h>
void PutString( const char* pChar ){
for( ; *pChar != 0; pChar++ )
{
putchar( *pChar );
}
}
char* GetString(){
char c[100];
int i = 0;
do
{
c[i] = getchar();
}while( c[i++] != '\n' );
c[i] = '\0';
// PutString( c );
return c;
}
void main(){
char* string = GetString();
PutString( string );
}
答案 0 :(得分:8)
因为c
是GetString
中的局部变量,并且您正在返回其地址,之后它将消失(移出范围)。这是未定义的行为 - 你不允许使用超出范围的东西。事实上,如果你通过gcc
运行它,它会非常明确地告诉你:
qq.cpp:9: warning: address of local variable ‘c’ returned
如果你想从一个函数返回非简单的东西(比如数组而不是整数或浮点数,它们为你制作一个副本),你需要(例如)动态分配它,以便它能在函数返回时存活下来。改变之类:
char c[100];
成:
char *c = malloc (100); // or equivalent 'new'.
(当然记得最终释放/删除它。)
即使您从GetString
返回时,您可能会在调试器中看到,但仍然无法按照标准进行保证。
无论如何,下一次堆叠操作(例如调用PutString
)很可能会消除这些信息。
这是一个以new/delete
方式执行的C ++版本:
#include <stdio.h>
void PutString (const char* pChar ){
for (; *pChar != 0; pChar++)
putchar( *pChar );
}
char* GetString (void) {
char *c = new char[100]; // memory behind c will survive ...
int i = 0;
do {
c[i] = getchar();
} while (c[i++] != '\n');
c[i] = '\0';
return c;
} // ... past here ...
int main (void) {
char* string = GetString();
PutString (string);
delete[] string; // ... until here.
return 0;
}
我还应该提一下,在C(fgets或an earlier answer of mine)和C ++(例如string getline和{}中获取基于行的输入的方法可能更好。 {3}})。
答案 1 :(得分:2)
您正在返回指向GetString()
中函数本地变量的指针,当函数返回时,回收分配给该变量的空间。
要修复这些问题,您可以为字符数组动态分配空间,也可以将其声明为静态,以便变量的生命周期成为整个程序。
答案 2 :(得分:1)
由于字符串(GetString
)被放入堆栈,因此char c[100]
将无法正常工作。当函数到达返回时,这将被删除。
使用malloc
或将数组传递给函数。