如何从函数中更改值或静态char *? C ++

时间:2010-05-29 02:46:05

标签: c++ static types redefine

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

示例:

static char *X = "test_1";

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

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

3 个答案:

答案 0 :(得分:6)

X = buf将指针X设置为指向数组buf的第一个元素。当函数返回时,buf超出范围而无法再使用,因此指针在此时无用。

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

答案 1 :(得分:2)

正如詹姆斯所说,使用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*

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

(你说你是c ++的新手,所以你可能没有听说过“未定义的行为”意味着计算机会让你面无表情......这通常意味着你的程序会崩溃)

答案 2 :(得分:0)

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)之前,请注意不要使它将指向的数据无效。