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
相关产品推荐
相关产品推荐

