我正在尝试更改我在启动时定义的“静态字符 *”的值,我从函数内部执行此操作,当此函数返回 var 时,我试图重新设置该值并不会保留它。
例子:
static char *X = "test_1";
void testFunc()
{
char buf[256];
// fill buf with stuff...
X = buf;
}
如何在不使用静态缓冲区的情况下实现这一目标?我应该使用其他数据类型吗?如果有,是哪一个?
该行将X = buf
指针设置为指向X
数组的第一个元素buf
。当函数返回时,buf
超出范围并且不能再使用,因此此时指针是无用的。
除非您有特定的理由在程序中使用原始 C 字符串,否则请使用std::string
容器,然后您可以简单地返回 astd::string
而不必担心自己为字符串动态分配和管理内存。
正如詹姆斯所说,使用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++ 的新手,所以你可能没有听说过“未定义的行为”意味着计算机可以打你的脸……这通常意味着你的程序会崩溃)
static char *X = "test_1";
void testFunc()
{
char buf[256];
// fill buf with stuff...
X = buf;
}
On the example above if you run and debug the code, you will see that the value of X will be changed on the line X = buf;
Once buf is not static and is defined inside a specific scope (between { }), it will be allocated as a temporary stack variable. Whenever the instruction pointer leaves that scope, buf becomes undefined, but X keeps the old buf address (pointing to a stack address) with a not valid data.
Notice that X is just a pointer, so you can change it anytime you want. And considering that it is static, its definition will be kept valid up to the end of the program.
So, if you want to change X value just atrib it anything you want. Just be careful to not invalidate the data it will point before you access X data (*X).