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

C语言结构体数组打印异常:重复输出最后一条输入内容

问题分析与修复

你的代码问题出在指针ptr没有随着循环迭代移动,导致所有输入都覆盖到了数组的第一个元素上,最终打印的自然是最后一次输入的内容。

具体问题点:

  • 初始化指针后,输入循环里每次处理完一个元素,都没有让ptr指向数组的下一个元素,所以所有输入都在修改同一个内存位置(数组首元素),后面的输入直接覆盖了前面的内容。
  • 打印循环同样没有移动指针,所以两次输出的都是最后一次覆盖的那个元素的数据。

修复后的代码:

#include<stdio.h>
struct my_structure {
    char name[20];
    int number;
    int rank;
};
int main() {
    int n,i;
    scanf("%d",&n);
    struct my_structure variable[n];
    struct my_structure *ptr;
    ptr = variable; // 数组名本身就是首元素地址,无需额外取址&
    
    // 输入循环:每次处理后让指针前进一个结构体大小
    for(i=0; i<n; i++) {
        scanf("%s",ptr->name);
        scanf("%d",&ptr->number);
        scanf("%d",&ptr->rank);
        ptr++; // 关键:让指针指向数组的下一个元素
    }
    
    // 打印前把指针重置回数组首地址
    ptr = variable;
    for(i=0; i<n; i++) {
        printf("NAME: %s\n", ptr->name);
        printf("NUMBER: %d\n", ptr->number);
        printf("RANK: %d\n", ptr->rank); // 加换行让输出更整洁
        ptr++; // 打印后同样移动指针
    }
    return 0;
}

更直观的替代方案(下标访问):

如果你觉得指针操作容易出错,也可以直接通过数组下标访问元素,可读性更强:

#include<stdio.h>
struct my_structure {
    char name[20];
    int number;
    int rank;
};
int main() {
    int n,i;
    scanf("%d",&n);
    struct my_structure variable[n];
    
    // 输入循环用下标访问
    for(i=0; i<n; i++) {
        scanf("%s",variable[i].name);
        scanf("%d",&variable[i].number);
        scanf("%d",&variable[i].rank);
    }
    
    // 打印循环用下标访问
    for(i=0; i<n; i++) {
        printf("NAME: %s\n", variable[i].name);
        printf("NUMBER: %d\n", variable[i].number);
        printf("RANK: %d\n", variable[i].rank);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Vinoth Viru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:06