C语言代码报错求助:数组赋值与参数类型不兼容
问题定位与代码修复
核心错误分析
1. 数组赋值错误
报错error: assignment to expression with array type:
数组变量是不可修改的左值,不能直接用=给整个数组赋值。str_Player函数已经将格式化后的字符串写入你传入的第二个参数数组中,无需再赋值给另一个数组。
2. 参数类型不匹配警告
警告passing argument 2 of 'show_Player' from incompatible pointer type:show_Player的第二个参数要求是Player*类型,但你传入了char*类型的数组,完全不符合函数定义。
代码修复步骤
步骤1:修正player_test.c的核心错误
- 移除数组赋值语句,直接将目标数组作为
str_Player的第二个参数传入 - 调用
show_Player时传入Player变量的地址&p1,而非字符串数组 - 替换
#include "player.c"为#include "player.h",避免重复定义问题 - 调整数组大小,确保能容纳格式化后的字符串
- 替换非标准
pause函数为标准库的getchar()
步骤2:修复player.c的潜在问题
- 定义
NAME_SIZE宏,解决未定义标识符错误 - 优化
str_Player的NULL分支,返回合法的字符串指针
步骤3:完善player.h的声明
- 补充
Player结构体的声明和NAME_SIZE宏定义 - 添加
show_Player的函数声明
修正后的完整代码
player.h
#ifndef PLAYER_H #define PLAYER_H #define NAME_SIZE 20 typedef struct { char name[NAME_SIZE]; int score; } Player; char *str_Player(Player *p, char s[]); void show_Player(char *s, Player *p); #endif
player.c
#include <stdio.h> #include "player.h" char *str_Player(Player *p, char s[]) { if (p != NULL) { sprintf(s, "%s %d", p->name, p->score); return s; } else { static char null_str[] = "NULL"; return null_str; } } void show_Player(char *s, Player *p) { if (p != NULL) { printf("%s: %s %d\n", s, p->name, p->score); } else { printf("%s: NULL\n", s); } }
player_test.c
#include <stdio.h> #include "player.h" int main() { printf(" %s %s\n", __DATE__, __TIME__); printf("\n--------------------------------------------------------------\n" "1. str_Player() and show_Player()\n"); Player p1 = {"Jane", 67}; char holder[NAME_SIZE + 10]; str_Player(&p1, holder); // 输出Player变量的大小(符合任务要求) printf("Size of Player variable: %zu\n", sizeof(p1)); printf("str_Player result: %s\n", holder); show_Player("First Player is", &p1); printf("\nPause ... Press Enter to continue\n"); getchar(); return 0; }
额外说明
- 原代码中
sizeof(holder)是求字符串数组的大小,任务要求输出Player变量的大小,因此改为sizeof(p1) - 补充了
show_Player的函数实现,满足任务展示需求 - 使用头文件保护机制,避免重复包含导致的编译错误
内容的提问来源于stack exchange,提问作者Programming_jager
相关产品推荐
相关产品推荐

