c++ - 从函数返回 char* 无效

标签 c++ pointers char

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

最佳答案

因为 cGetString 中的一个局部变量,您返回它的地址,之后它就消失了(移出范围)。这是未定义的行为——你不能使用超出范围的东西。事实上,如果您通过 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 getlinechar array getline)中,可能有更好的方法来获取基于行的输入。

关于c++ - 从函数返回 char* 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13206752/

相关文章:

c++ - 如何为模板化类声明类外二元运算符?

c++ - 记录重新抛出错误的函数

c++ - 使用 decltype 推导返回类型时避免代码大量重复的最佳方法

C 数组,我的内存会发生什么

c - 为什么我无法获取字符串输入?

在 C 中从 uint8_t * 转换为 char *

c++ - 左值在使用 std::make_pair 时指定 const 对象

pointers - 指向 map 的指针

c - C中的自修改代码 : Use a function pointer?

c - 如何克服 Stack Smashing 错误?