字符串赋值问题:
#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){//卡槽1gnsst = "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当作常量来使用。