C语言链表打印单个字符报错,如何正确输出目标字符?
C语言双向链表打印单个字符报错问题分析
完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> struct data{ char help[5]; struct data *next; struct data *prev; }*head = NULL, *tail = NULL, *curr = NULL, *temp = NULL; void backpush(char input[5]){ curr = (struct data*) malloc(sizeof(struct data)); strcpy(curr->help, input); if(head == NULL){ head = tail = curr; head->next = NULL; head->prev = NULL; } else{ tail->next = curr; curr->prev = tail; curr->next = NULL; tail = curr; } } int main(){ char code[][5] = {"7R", "4R", "6B", "0B", "8R", "5R", "3B"}; for(int i = 0;i<7;i++){ backpush(code[i]); } // 引发报错的代码 curr = head; printf("%s", curr->help[0]); }
报错原因
核心是格式符与参数类型不匹配:
printf的%s格式符要求传入字符串首地址(char*类型),它会从该地址开始打印直到遇到终止符\0。curr->help[0]是help字符数组的第一个元素,类型为char,它的值是字符'7'的ASCII码(0x37)。当你把这个值传给%s时,printf会把0x37当成内存地址去访问,属于非法内存操作,直接触发程序崩溃。
修正方法
如果只想打印头节点help字段的第一个字符,改用%c格式符:
curr = head; printf("%c", curr->help[0]); // 正确输出'7'
如果要打印完整的"7R"字符串,直接传curr->help(数组名会隐式转换为字符串首地址):
curr = head; printf("%s", curr->help); // 输出'7R'
内容的提问来源于stack exchange,提问作者Fernando Gunawan
相关产品推荐
相关产品推荐

