如何修复C语言中char结构体指针赋值的类型不兼容报错
问题原因
你遇到的报错是指针类型不匹配导致的,核心问题是混淆了数组首元素地址和整个数组的地址的类型差异:
- 结构体中
equipa1是长度为10的char数组,直接写games[0].equipa1时,数组名会隐式转换为首元素的地址,类型是char *,和你要赋值的venc、ptrw的类型完全匹配 - 你加了
&之后&games[0].equipa1的类型变成了char (*)[10],也就是指向长度为10的char数组的指针,和char *是完全不同的指针类型,因此触发类型不兼容报错。
解决方案
只需要修改报错片段里的两行代码,去掉多余的取地址符&即可:
if (games[0].mapas1 > games[0].mapas2) { // 原错误写法 games[0].venc = &games[0].equipa1; 去掉&即可 games[0].venc = games[0].equipa1; strcpy(games[4].equipa1, games[0].venc); // 原错误写法 char *ptrw = &games[0].equipa1; 去掉&即可 char *ptrw = games[0].equipa1; for (i = 0; i < 5; i++) { for (j = 0; j < 10; j++) { if (strcmp(games[i].jog1, eq[0].jogadores[j].nome) == 0) { eq[0].jogadores[j].rating = eq[0].jogadores[j].rating + 0.3; } if (strcmp(games[i].jog1, eq[1].jogadores[j].nome) == 0) { eq[1].jogadores[j].rating = eq[1].jogadores[j].rating - 0.2; } } } }
额外注意
当前写法中venc是直接指向equipa1的内存空间,后续如果修改了games[0].equipa1的内容,venc指向的内容也会同步变化。如果需要venc存储独立的字符串,可以主动申请堆内存再拷贝内容:
games[0].venc = malloc(10); if (games[0].venc != NULL) { strcpy(games[0].venc, games[0].equipa1); } // 程序退出前不需要使用时,记得调用free(games[0].venc)释放内存避免泄漏
内容的提问来源于stack exchange,提问作者Duochannel YT
相关产品推荐
相关产品推荐

