我正在尝试更改我在启动时定义的“静态字符*”的值,我是从函数内部执行的,当此函数返回var时我试图重新设置该值不会保留它
示例:
static char *X = "test_1";
void testFunc()
{
char buf[256];
// fill buf with stuff...
X = buf;
}
如何在不使用静态buf的情况下实现此目的?我应该使用其他数据类型吗?如果是的话,哪一个?
答案 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*
。
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)之前,请注意不要使它将指向的数据无效。