字符串赋值问题:
#include <stdio.h>
#include <string.h>
char* my_string_cat(int position, int slot, char* content){
char* gnsst = NULL;
static char retvalue[50];
memset(retvalue, '\0', sizeof(retvalue));
if(position == 0){//头部
if(slot == 0){//卡槽1
gnsst = "gnss1";
}else{
gnsst = "gnss2";
}
}
else if(position == 1){//中间
if(slot == 0){
gnsst = "通过gnss1";
}else{
gnsst = "通过gnss2";
}
}
sprintf(retvalue,"%s%s",gnsst,content);
return retvalue;
}
int main(){
char* a = my_string_cat(0, 0, "运行的");
char* b = my_string_cat(1, 1, "运行的");
printf("a: %s\n", a);
printf("b: %s\n", b);
}
项目中写了这样一个函数用于给char* a, char*b看似很优雅其实问题严重的一批。
用static是为了延长retvalue的生存周期,因为retvalue的生存周期是被限制在了这个函数中,函数结束生命周期也就结束,内存也就自动会被回收,但是用static之后retvalue就变成了静态数组,a指向了retvalue, b指向了retvalue,那么问题就很严重了retvalue的值是不断变动的那么,a和b的值也就会不断变动,a和b的值是一样的
那么为了解决问题我需要a和b都指向一个字符串常量,那么解决办法就是
char* array[] = {"122", "123"};
char* a = array[0];
char* b = array[1];
“122” 会被存储在全局字符串表(Global String Table)中。这是一个由编译器维护的表,它存储了程序中所有的字符串常量,这样就不必担心a、b的值会变动了,维护就到array里维护
multiple definition of … first defined here报错:
上述报错主要因为一个变量int x被定义在了一个a.h文件中,b.c和d.c都调用了这个头文件当你想编译b.c和d.c生成一个可执行main文件的时候,x在b中被定义一次,在d中被定义一次,对于整个可执行文件main来说x被定义了两次,所以报错
解决办法用static或用const修饰x变量,static修饰的变量在d和b文件中都会有一个独立的副本,他们互不影响,const就是把x当作常量来使用。