从函数返回char *不起作用

时间:2012-11-03 06:43:06

标签: c++ pointers char

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 );
}

3 个答案:

答案 0 :(得分:8)

因为cGetString中的局部变量,并且您正在返回其地址,之后它将消失(移出范围)。这是未定义的行为 - 你不允许使用超出范围的东西。事实上,如果你通过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(fgetsan earlier answer of mine)和C ++(例如string getline和{}中获取基于行的输入的方法可能更好。 {3}})。

答案 1 :(得分:2)

您正在返回指向GetString()中函数本地变量的指针,当函数返回时,回收分配给该变量的空间。

要修复这些问题,您可以为字符数组动态分配空间,也可以将其声明为静态,以便变量的生命周期成为整个程序。

答案 2 :(得分:1)

由于字符串(GetString)被放入堆栈,因此char c[100]将无法正常工作。当函数到达返回时,这将被删除。

使用malloc或将数组传递给函数。