C语言使用strcpy后结构体字符串输出乱码问题求助
结构体字符串字段乱码问题修复方案
你代码里的核心问题是柔性数组的错误使用。结构体中的char estado[]是C语言的柔性数组成员,它本身不占用结构体的内存空间,必须配合动态内存分配才能使用。但你直接定义了Mortalidade estados[27];数组,每个结构体实例的estado字段没有分配任何存储空间,调用strcpy复制字符串时会越界写入到相邻结构体的内存区域,导致数据覆盖,最终打印出乱码。
下面给出两种可行的修复方案,优先推荐第一种适合初学者的简单方案:
方法1:给字符串字段指定固定大小
因为你存储的是巴西州的缩写(如"AC"),都是2个字符,加上字符串结束符\0,只需要3个字节的空间。修改结构体定义,把柔性数组改成固定大小的字符数组即可:
#include <stdio.h> #include <string.h> typedef struct { float mort_2009, mort_2015, indice; // 修正字段名:原代码写的是indices,后续赋值用的是indice,统一为indice避免警告 char estado[3]; // 固定大小,足够存储2个字符+结束符 } Mortalidade; void defineEstados ( Mortalidade *e, char estado[], float mort_2009, float mort_2015, int posix) { strcpy(e[posix].estado, estado); e[posix].mort_2009 = mort_2009; e[posix].mort_2015 = mort_2015; e[posix].indice = mort_2009 / mort_2015; } void imprimeEstados (Mortalidade *e){ for (int i = 0; i < 3; i++){ printf("Estado: %s, Morte em 2009: %.1f, Morte em 2015: %.1f, Indice: %.2f\n", e[i].estado, e[i].mort_2009, e[i].mort_2015, e[i].indice); } } int main() { Mortalidade estados[27]; defineEstados(estados, "AC", 12.6, 10.6, 0); defineEstados(estados, "AL", 12.6, 10.6, 1); defineEstados(estados, "AP", 12.6, 10.6, 2); imprimeEstados(estados); return 0; }
关键修改点:
- 将
char estado[]改为char estado[3],给字符串分配足够的固定存储空间 - 统一结构体字段名,避免编译警告
方法2:使用柔性数组+动态内存分配(进阶)
如果后续需要存储更长的字符串,可以用柔性数组,但必须为每个结构体实例动态分配内存,同时要注意内存释放避免泄漏:
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { float mort_2009, mort_2015, indice; char estado[]; // 保留柔性数组 } Mortalidade; // 动态创建Mortalidade实例的函数 Mortalidade* createMortalidade(const char* estado, float mort_2009, float mort_2015) { size_t str_len = strlen(estado); // 分配结构体大小 + 字符串长度 + 1(结束符)的内存 Mortalidade* e = malloc(sizeof(Mortalidade) + str_len + 1); if (!e) return NULL; // 处理内存分配失败的情况 strcpy(e->estado, estado); e->mort_2009 = mort_2009; e->mort_2015 = mort_2015; e->indice = mort_2009 / mort_2015; return e; } void imprimeEstados (Mortalidade** e, int count){ for (int i = 0; i < count; i++){ printf("Estado: %s, Morte em 2009: %.1f, Morte em 2015: %.1f, Indice: %.2f\n", e[i]->estado, e[i]->mort_2009, e[i]->mort_2015, e[i]->indice); free(e[i]); // 用完后释放内存,避免泄漏 } } int main() { Mortalidade* estados[27]; // 存储结构体指针的数组 estados[0] = createMortalidade("AC", 12.6, 10.6); estados[1] = createMortalidade("AL", 12.6, 10.6); estados[2] = createMortalidade("AP", 12.6, 10.6); imprimeEstados(estados, 3); return 0; }
内容的提问来源于stack exchange,提问作者Guilherme Hepfener
相关产品推荐
相关产品推荐

