【问题标题】:How can I change the value or a static char* from a function? C++如何从函数中更改值或静态 char*? C++
【发布时间】:2011-02-25 09:18:53
【问题描述】:

我正在尝试更改我在启动时定义的“静态字符 *”的值,我从函数内部执行此操作,当此函数返回 var 时,我尝试重新设置该值不保留它。

例子:

static char *X = "test_1";

void testFunc()
{
    char buf[256];
    // fill buf with stuff...
    X = buf;
}

如何在不使用静态作为 buf 的情况下实现这一点?我应该使用其他数据类型吗?如果有,是哪一个?

【问题讨论】:

    标签: c++ static types redefine


    【解决方案1】:

    X = buf 行将指针X 设置为指向数组buf 的第一个元素。当函数返回时,buf 超出范围,不能再使用,所以此时指针是没用的。

    除非您有特殊原因在程序中使用原始 C 字符串,否则请使用 std::string 容器,然后您可以简单地返回 std::string,而不必担心自己为字符串动态分配和管理内存。

    【讨论】:

    • 是的,我刚开始使用 cpp,我正在开发一个 win32 应用程序,我还不知道如何使用 std,所以我想在了解它之前完成这个项目。
    • @flyout : 首先学习字符串...与跟踪 char* 错误相比,学习 string 花费的时间更少 :)
    【解决方案2】:

    正如 James 所说,使用 std::string... 除非注意在翻译单元之间未定义全局构造和销毁顺序。

    因此,如果您仍想使用char*,请使用strcpy(请参阅man strcpy)并确保buf 以NUL 结尾。 strcpy 会将buf 复制到目标X

    char buf[256];
    // ...
    strcpy(X, buf);
    

    我应该补充一点,使用std::string 的理由更多。使用strcpy 时,需要确保目标缓冲区(X)有足够的内存来接收源缓冲区。在这种情况下,256 比strlen("test_1") 大得多,所以你会遇到问题。有一些方法可以解决重新分配 X 的问题(例如 X = new char[number_of_characters_needed])。或者将 X 初始化为 256 的 char 数组,而不是 char*

    IIRC,strcpy 到静态定义的字符串文字(如 char *X = "test_1")是未定义的行为......故事的寓意是......它是 C++!使用std::string! :)

    (你说你是 C++ 新手,所以你可能没有听说过“未定义行为”意味着计算机可以打你的脸……这通常意味着你的程序会崩溃)

    【讨论】:

    • @Niall:哈,刚刚完成了我的编辑...我试图解释问题,但如果他想朝自己的脚开枪...这是枪。
    • 我现在正在使用 std::string,strcpy 正在工作,但我发现它在某些时候崩溃了,std::string 工作正常,而且它有很多我可以使用的功能我没有不知道,比如 .Compare() 非常感谢。
    • @flyout:很高兴听到! string 绝对是要走的路。虽然字符串使事情变得简单,但了解char* 的来龙去脉总是很好的:)
    【解决方案3】:
    static char *X = "test_1";
    
    void testFunc()
    {
        char buf[256];
        // fill buf with stuff...
        X = buf;
    }
    

    在上面的示例中,如果您运行并调试代码,您会看到 X 的值将在 X = buf; 行发生变化

    一旦 buf 不是静态的并且在特定范围内定义(在 { } 之间),它将被分配为临时堆栈变量。每当指令指针离开该范围时,buf 就会变为未定义,但 X 会保留旧的 buf 地址(指向堆栈地址)和无效数据。

    请注意,X 只是一个指针,因此您可以随时更改它。并且考虑到它是静态的,它的定义将一直有效到程序结束。

    因此,如果您想更改 X 值,只需将其归因于您想要的任何内容。请注意不要在访问 X 数据 (*X) 之前使其指向的数据无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多