GCC带-Werror编译时struct字符数组成员初始化报错如何解决
错误原因
- 编译报错本质是C语言不支持在结构体初始化时直接用数组变量给数组成员赋值:在C语法中,数组名
file_name作为右值使用时会自动退化为char*指针,而结构体中name成员是char[A1FS_NAME_MAX]类型的数组,初始化时编译器会尝试把传入的指针赋值给name数组的第一个char元素,因此抛出「从char *初始化char导致整数从指针生成无类型转换」的报错。 - 第二个「初始化器周围缺少大括号」的报错是配套产生的:编译器识别到你在给数组类型成员赋值,默认你要逐个指定数组元素的初始值,因此要求你用大括号包裹初始化列表,直接传入指针不符合语法要求。
修复方案
你只需要拆分赋值逻辑,初始化结构体时只对ino成员赋值,之后单独复制字符串到name数组即可,修改后的代码如下:
char file_name[A1FS_NAME_MAX]; strcpy(file_name, strrchr(path, '/') + 1); a1fs_dentry *new_dentry_ptr = (a1fs_dentry *) fs->data_table + last_extent->start * A1FS_BLOCK_SIZE + remaining_directory_entries * sizeof(a1fs_dentry); // 先初始化ino成员,未显式初始化的成员默认清零 *new_dentry_ptr = (a1fs_dentry) { .ino = (a1fs_ino_t) fs->first_free_inode_i }; // 单独复制文件名到name数组 strcpy(new_dentry_ptr->name, file_name);
如果担心strcpy的溢出风险,也可以替换为更安全的写法:
strncpy(new_dentry_ptr->name, file_name, A1FS_NAME_MAX - 1); new_dentry_ptr->name[A1FS_NAME_MAX - 1] = '\0';
内容的提问来源于stack exchange,提问作者Trentwt
相关产品推荐
相关产品推荐

