C 更新模块级状态字符串的正确方法

C 更新模块级状态字符串的正确方法,c,memory,static,scope,C,Memory,Static,Scope,我有一个模块级字符串,声明方式如下: char* sStatus = NULL; 此字符串可以为空无状态,也可以具有指示状态的关联字符串。状态字符串可以从程序的不同部分读取和写入,这是完全同步的,因此不存在并发问题 如何最好地更新此字符串?例如,如果我写了如下内容: void addNewRecord(){ sStatus = "adding new record"; ... ... sStatus = "finished adding new record"; }

我有一个模块级字符串,声明方式如下:

char* sStatus = NULL;
此字符串可以为空无状态,也可以具有指示状态的关联字符串。状态字符串可以从程序的不同部分读取和写入,这是完全同步的,因此不存在并发问题

如何最好地更新此字符串?例如,如果我写了如下内容:

void addNewRecord(){
   sStatus = "adding new record";
   ...
   ...
   sStatus = "finished adding new record";
}
然后它就可以工作了,但我担心字符串是函数的本地字符串,所以一旦函数退出,字符串就不再有效了?然而,程序并没有崩溃。我打印出了指针的地址,它肯定不在堆栈上,似乎在某种恒定的内存区域中,所以应该是安全的


然而,我想知道处理这种数据结构使用的正确方法是什么。

您应该使用strncpy来复制添加新记录的字符串sStatus:

  memset(sStatus, '\0', strlen(sStatus));  //clear before update
  strncpy(sStatus, "adding new record", strlen((const char *)"adding new record"));

当然,在将字符串复制到sStatus之前,应该为它分配内存。

在这段代码中,添加新记录是一个常量字符串,与我的相同。将常量字符串复制到内存堆的分配区域可能是对直接将状态引用指向常量内存字符串的改进吗?@TylerDurden,添加新记录的字符串作为局部变量,仅存在于函数addNewRecord中。调用函数后,将释放此局部变量。这就是为什么即使你的sStatus仍然指向相同的堆栈地址,但里面的内容不同。@TylerDurden,另一种方法是,如果状态是固定的,那么假设只有两个或三个状态可用。然后您可以将它们全局声明为sStatus。正如我在文章中所说,我打印了指向字符串文本的指针,但它不在堆栈上。指针似乎在全局常量内存中。首先,没有绑定检查,您很可能会跳过分配的内存。其次,不管怎样,当strcpy将注入null terminator时,您不需要memset。为什么要浪费CPU周期?