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

typedef结构体数组仅存储最后一个输入值的问题求助

问题排查:结构体数组仅保存最后一个输入姓名的原因

问题描述

我尝试获取3个姓名作为投票候选人,并将它们赋值给已定义的typedef结构体数组。但运行代码后,数组中仅保存了最后一个输入的姓名,第二个循环只打印出最后一个名字。

原代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    char *name;
    int votes;
} candidate;
#define MAX 9
candidate candidates[MAX];

int main(void)
{
    char candid[10];
    for (int i =0; i<3; i++)
    {
        scanf("%s",candid);
        candidates[i].name = candid;
        candidates[i].votes = 0;
    }

    printf("Names:\n");

    for (int i = 0; i < 3; i++)
    {
        printf("%s\n",candidates[i].name);
    }
}

运行输出

Charlie
Ana 
David
Names: 
David
David
David

错误原因

核心问题在于结构体中的name是指针类型,你在循环里把所有candidates[i].name都赋值成了同一个局部数组candid的地址。也就是说,三个结构体的name指针都指向了同一块内存空间。每次调用scanf输入新名字时,都会覆盖candid数组里的旧内容,循环结束后,这块内存里只剩最后一次输入的"David",所以打印时三个指针都指向这个值,自然全输出David。

修复方案

方案一:为每个姓名分配独立动态内存

通过malloc为每个结构体的name分配独立内存,再用strcpy复制输入的字符串,确保每个指针指向不同的内存块:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    char *name;
    int votes;
} candidate;
#define MAX 9
candidate candidates[MAX];

int main(void)
{
    char candid[10];
    for (int i = 0; i < 3; i++)
    {
        scanf("%s", candid);
        // 分配足够内存(+1用于存储字符串结束符'\0')
        candidates[i].name = malloc(strlen(candid) + 1);
        // 检查内存分配是否成功
        if (candidates[i].name == NULL)
        {
            fprintf(stderr, "内存分配失败\n");
            return 1;
        }
        strcpy(candidates[i].name, candid);
        candidates[i].votes = 0;
    }

    printf("Names:\n");
    for (int i = 0; i < 3; i++)
    {
        printf("%s\n", candidates[i].name);
        // 使用完后释放内存,避免泄漏
        free(candidates[i].name);
    }

    return 0;
}

方案二:将结构体name改为固定大小字符数组

直接把结构体中的name定义为固定大小的字符数组,避免指针指向同一内存,直接复制字符串即可:

#include <stdio.h>
#include <string.h>

typedef struct
{
    char name[10]; // 和输入缓冲区大小一致,确保能容纳输入的姓名
    int votes;
} candidate;
#define MAX 9
candidate candidates[MAX];

int main(void)
{
    char candid[10];
    for (int i = 0; i < 3; i++)
    {
        scanf("%s", candid);
        strcpy(candidates[i].name, candid);
        candidates[i].votes = 0;
    }

    printf("Names:\n");
    for (int i = 0; i < 3; i++)
    {
        printf("%s\n", candidates[i].name);
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:22:40