C语言报错Cannot access memory at address 学生生日排序代码输入异常
错误原因
- 核心问题1:结构体
birth的name成员定义为char*类型,仅声明了一个字符指针,未分配任何可用于存储字符串的合法内存空间,直接写入数据属于非法内存访问。 - 核心问题2:
scanf输入语句写法错误:%s格式符要求传入字符指针类型的参数,p->name本身就是指针,不需要额外加取地址符&;&p->name的语义是取指针变量自身的内存地址,会将输入的字符串写入指针变量的存储空间,直接破坏指针值,后续访问name时就会触发Cannot access memory错误。 - 额外不规范写法:
time成员是数组类型,数组名本身就代表首地址,scanf时不需要加&,只是巧合下地址值一致没有触发错误,但写法不符合规范。
修复方案
最简单的修复方式是将name改为固定长度的字符数组,无需手动管理动态内存,修改点如下:
- 修改结构体定义,将
char *name改为定长字符数组,比如char name[20];(可根据实际姓名长度调整上限) - 修改
scanf输入语句,去掉两个参数前的&符
修复后完整代码:
#include <stdio.h> #include <string.h> typedef struct birth{ // 改为定长字符数组,提前分配内存空间 char name[20]; char time[12]; }birth; void swap(struct birth *a, struct birth *b){ struct birth tmp; tmp = *a; *a = *b; *b = tmp; } int main(){ int n; birth list[100], *p, *q; scanf("%d", &n); getchar(); for(p = list; p < list + n; p++){ // 去掉参数前的&,数组名本身就是合法的输入地址 scanf("%s %s", p->name, p->time); } for(p = list; p < list + n - 1; p++){ for(q = p + 1; q < list + n; q++){ if(strcmp(p->time, q->time) > 0){ swap(p ,q); } else if(strcmp(p->time, q->time) == 0){ if(strcmp(p->name, q->name) > 0){ swap(p ,q); } } } } for(int i = 0; i < n; i++){ printf("%s %s\n", list[i].name, list[i].time); } return 0; }
如果需要保留char*类型的name定义,可在输入前为每个name手动分配内存:p->name = malloc(20);,程序结束前需要调用free释放对应内存避免泄漏。
内容的提问来源于stack exchange,提问作者leejoy
相关产品推荐
相关产品推荐

