Visual studio c++ 显示第 24 行的“string”有一个数组元素,但顶部包含用户输入的所有文本。但是当我发送到 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 );
}
最佳答案
因为 c
是 GetString
中的一个局部变量,您返回它的地址,之后它就消失了(移出范围)。这是未定义的行为——你不能使用超出范围的东西。事实上,如果您通过 gcc
运行它,它会非常明确地告诉您:
qq.cpp:9: warning: address of local variable ‘c’ returned
如果你想从一个函数返回非简单的东西(比如数组而不是整数或 float ,它们会为你创建一个拷贝),你需要(例如)动态分配它,以便它在函数返回后仍然存在。像改变的东西:
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 和 char array getline)中,可能有更好的方法来获取基于行的输入。
关于c++ - 从函数返回 char* 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13206752/