如何使用函数返回值初始化struct结构体成员,解决初始化元素非常量报错
问题原因
C语言规定,具有静态存储周期的变量(包括全局变量、static修饰的局部变量)的初始化值必须是编译期可确定的常量,不能是运行期才能得到返回值的函数调用结果。你这里的default_state是全局变量,用concat()函数的返回值做初始化,自然会报initializer element is not constant错误。
解决方法
方法1:把结构体初始化逻辑移到程序入口执行
不要用全局静态初始化,改为在main函数最开头调用concat完成赋值,修改后代码示例:
#include <stdio.h> #include <string.h> #include <stdlib.h> char* concat(char* dest, char* src) { strcat(dest, src); return dest; } char string1[15] = "hello"; char string2[15] = "world"; typedef struct { char* member; } STATE; // 先声明全局变量,不做带函数调用的初始化 STATE default_state; int main() { // 程序启动后第一时间完成初始化 default_state.member = concat(string1, string2); // 后续业务逻辑 printf("%s", default_state.member); return 0; }
方法2:如果拼接的是固定字符串常量,直接用C语言内置的字符串常量拼接特性
如果你的两个拼接项都是字符串字面量,C编译器会自动把相邻的多个字符串常量拼接为一个,不需要调用运行期函数:
typedef struct { char* member; } STATE; // 两个字符串常量直接挨在一起写即可自动拼接 STATE default_state = { "hello""world" };
如果拼接内容是固定的,这种方式性能最高,完全在编译期完成处理。
补充注意点
你当前代码里的concat直接修改了string1的内容,如果后续其他地方还要用原始的string1的值会出问题,建议如果不想修改原字符串,可以给结构体成员单独分配内存存储拼接结果,示例:
// 新写拼接函数,不修改原字符串,返回新申请的堆内存 char* concat_new(const char* src1, const char* src2) { int len = strlen(src1) + strlen(src2) + 1; char* res = malloc(len); strcpy(res, src1); strcat(res, src2); return res; } // main里初始化调用 default_state.member = concat_new(string1, string2); // 结构体不用的时候记得free掉member指向的内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者xwedea
相关产品推荐
相关产品推荐

