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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:45:01