You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:06:03