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

为什么C编译器尝试将char*转换为char?结构体char数组成员初始化报错

问题原因

你遇到的报错本质是C语言的数组退化为指针规则和数组不能直接初始化/赋值的语法限制:

  • 当你把数组名name作为参数写在初始化列表Drink{ name, volume, price, quantity }里时,数组名会自动退化为指向首元素的char*指针,不再是char[10]数组类型
  • C语言不支持直接用指针给数组类型的结构体成员做初始化,编译器会把这个写法理解为你要给数组的第一个char元素赋值,自然就会抛出char*不能初始化char类型的错误。
解决方法

纯C环境通用方案

不要直接用聚合初始化给结构体赋值,先声明结构体变量,手动拷贝字符串后再赋值给数组:

while (fscanf(fp, "%9s %d %lf %d", name, &volume, &price, &quantity) != EOF) {
    struct Drink tmp;
    strcpy(tmp.name, name);
    tmp.volume = volume;
    tmp.price = price;
    tmp.quantity = quantity;
    machine[count++] = tmp;
}

注意:上面把%s改成了%9s,是为了限制读取的字符串长度不超过9位,预留1位存储字符串结束符\0,避免数组越界。另外建议增加fopen的返回值判断,避免文件打开失败导致空指针访问。

C++环境简化方案

如果你的代码是C++环境,可以直接把结构体里的数组成员替换为std::string,就能直接用指针初始化,不需要手动拷贝:

#include <string>
struct Drink {
    std::string name;
    int volume;
    double price;
    int quantity;
};

内容的提问来源于stack exchange,提问作者p4rt2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:06:00