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

循环遍历结构体数组时输出值异常,仅字符串打印错误问题咨询

问题结论

你编写的打印for循环本身没有错误,问题出在字符串的存储逻辑上。

问题根因

你的TransactionRequest结构体中,requestType被定义为char*指针类型,你赋值时直接存储了strtok返回的指针:

char *transType = word;
transaction.requestType = transType;

strtok切割字符串返回的所有指针,都指向你读行用的同一个line缓冲区。每次调用fgets读取新行时,都会覆盖line中的原有内容;读取全部行结束后,line缓冲区也可能被其他逻辑改写甚至释放。此时你之前存在结构体里的requestType指针已经指向无效内容,所以打印会出错。
而你存完字符串立刻打印时,line还没有被新内容覆盖,所以可以得到正确结果。int类型的成员存储的是值本身,不存在指针引用失效的问题,所以全程都能正常打印。

修复方案

两种常用修复方式:

  1. 修改结构体定义,将requestType改为固定长度的字符数组,直接存储字符串内容而非指针:
struct TransactionRequest
{
    // 发起交易的客户ID
    int client;
    // 客户发起的交易类型,长度可根据实际业务调整
    char requestType[32];
    // 客户操作的账户编号
    int account;
    // 交易涉及的金额
    int amount;
};

赋值时使用strcpy拷贝内容:

strcpy(transaction.requestType, transType);
  1. 保留指针类型的话,赋值时主动申请内存拷贝字符串内容:
// 申请内存时要多留一位存字符串结束符'\0'
transaction.requestType = malloc(strlen(transType) + 1);
strcpy(transaction.requestType, transType);

这种方式需要注意在程序结束、不再使用交易数据时,调用free释放对应内存,避免内存泄漏。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:07