循环遍历结构体数组时输出值异常,仅字符串打印错误问题咨询
问题结论
你编写的打印for循环本身没有错误,问题出在字符串的存储逻辑上。
问题根因
你的TransactionRequest结构体中,requestType被定义为char*指针类型,你赋值时直接存储了strtok返回的指针:
char *transType = word; transaction.requestType = transType;
strtok切割字符串返回的所有指针,都指向你读行用的同一个line缓冲区。每次调用fgets读取新行时,都会覆盖line中的原有内容;读取全部行结束后,line缓冲区也可能被其他逻辑改写甚至释放。此时你之前存在结构体里的requestType指针已经指向无效内容,所以打印会出错。
而你存完字符串立刻打印时,line还没有被新内容覆盖,所以可以得到正确结果。int类型的成员存储的是值本身,不存在指针引用失效的问题,所以全程都能正常打印。
修复方案
两种常用修复方式:
- 修改结构体定义,将
requestType改为固定长度的字符数组,直接存储字符串内容而非指针:
struct TransactionRequest { // 发起交易的客户ID int client; // 客户发起的交易类型,长度可根据实际业务调整 char requestType[32]; // 客户操作的账户编号 int account; // 交易涉及的金额 int amount; };
赋值时使用strcpy拷贝内容:
strcpy(transaction.requestType, transType);
- 保留指针类型的话,赋值时主动申请内存拷贝字符串内容:
// 申请内存时要多留一位存字符串结束符'\0' transaction.requestType = malloc(strlen(transType) + 1); strcpy(transaction.requestType, transType);
这种方式需要注意在程序结束、不再使用交易数据时,调用free释放对应内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Marco Aiello
相关产品推荐
相关产品推荐

