C语言中printf结构体char成员触发Segmentation fault问题求助
段错误原因排查及修复
核心问题
触发段错误的直接原因是第一条printf语句的格式符使用错误:
printf("%s ", player_Room->room_ID);
%s格式符要求传入字符串指针(char*),但你传入的是char类型的room_ID。程序会把字符'0'的ASCII值(48)当作内存地址去读取,这个地址属于系统保护的低地址空间,直接触发内存访问错误(Segmentation Fault)。
修复方案
- 打印单个字符改用
%c格式符:printf("%c ", player_Room->room_ID); - 额外建议:
- 检查
malloc的返回值:内存分配可能失败,直接使用空指针会导致后续操作崩溃,必须加判断。 - C标准中不需要强制转换
malloc的返回值,强制转换反而可能掩盖隐式声明问题。 - 记得用
free释放malloc分配的内存,避免内存泄漏。
- 检查
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char room_ID; char room_exits[4]; char room_description[255]; } Room; int main(){ Room *player_Room = malloc(sizeof(Room)); if (player_Room == NULL) { perror("malloc failed"); return 1; } player_Room->room_ID = '0'; strcpy(player_Room->room_description, "There is an ogre in the room"); strcpy(player_Room->room_exits, "N..."); printf("%c ", player_Room->room_ID); printf(" %s", player_Room->room_description); free(player_Room); return 0; }
内容的提问来源于stack exchange,提问作者Stefan L McNamara
相关产品推荐
相关产品推荐

