You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言报错Cannot access memory at address 学生生日排序代码输入异常

错误原因
  • 核心问题1:结构体birth的name成员定义为char*类型,仅声明了一个字符指针,未分配任何可用于存储字符串的合法内存空间,直接写入数据属于非法内存访问。
  • 核心问题2:scanf输入语句写法错误:%s格式符要求传入字符指针类型的参数,p->name本身就是指针,不需要额外加取地址符&;&p->name的语义是取指针变量自身的内存地址,会将输入的字符串写入指针变量的存储空间,直接破坏指针值,后续访问name时就会触发Cannot access memory错误。
  • 额外不规范写法:time成员是数组类型,数组名本身就代表首地址,scanf时不需要加&,只是巧合下地址值一致没有触发错误,但写法不符合规范。
修复方案

最简单的修复方式是将name改为固定长度的字符数组,无需手动管理动态内存,修改点如下:

  1. 修改结构体定义,将char *name改为定长字符数组,比如char name[20];(可根据实际姓名长度调整上限)
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:54:03