在strcpy后用字符串打印的垃圾

hc8w905p  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(105)

我是一个C语言的初学者,我试图将一个字符串复制到另一个字符串中。我有以下代码:

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

typedef struct {
    float mort_2009, mort_2015, indices;
    char estado[];
} 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;
}

我的结构Mortalidade有一个名为estado的字段,它将接收一个字符串(和其他数据)在void函数defineEstados中。因此,在使用strcpy复制结构体内部的字符串之后,在void函数imprimeEstados中,当我想打印结构体内部的estados时,结果看起来像变量内部的垃圾,我不知道如何找到错误。下面是获得的输出:

Estado: ��IA��)A�&�?��IA��)A�&�?AP, Morte em 2009: 12.6, Morte em 2015: 10.6, Indice: 1.19 
Estado: ��IA��)A�&�?AP, Morte em 2009: 12.6, Morte em 2015: 10.6, Indice: 1.19 
Estado: AP, Morte em 2009: 12.6, Morte em 2015: 10.6, Indice: 1.19

我不知道该怎么办,也不知道该怎么办。
注意:我假装插入更多的estados,但我更喜欢修复以前的代码。

h43kikqp

h43kikqp1#

typedef struct {
    float mort_2009, mort_2015, indices;
    char estado[];
} Mortalidade;

estado是一个长度为零(0)的灵活数组成员。您不能像在程序中那样使用此结构,因为静态分配不会为其分配任何内存。
此类结构旨在用于动态分配。

typedef struct {
    float mort_2009, mort_2015, indices;
    char estado[];
} Mortalidade;

void defineEstados (
    Mortalidade **e, 
    char estado[],
    float mort_2009,
    float mort_2015,
    int posix)
{
    e[posix] = malloc(sizeof(**e) + strlen(estado) + 1);
    if(e[posix])
    {
        strcpy(e[posix] -> estado, estado);
        e[posix] -> mort_2009 = mort_2009;
        e[posix] -> mort_2015 = mort_2015;
        e[posix] -> indices = mort_2009 / mort_2015;
    }
}

void imprimeEstados (Mortalidade **e){
    for (int i = 0; i < 3; i++){
        if(e[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] -> indices);
    }
}

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);
    //free memory
    return 0;
}

https://godbolt.org/z/13j31hGeG

bq9c1y66

bq9c1y662#

问题是您声明了一个具有灵活数组成员的结构,该成员名为estado

typedef struct {
    float mort_2009, mort_2015, indices;
    char estado[];
} Mortalidade

它具有不完整的字符数组类型。
您需要为数据成员沿着结构类型的对象分配内存,或者指定数组的固定大小,或者将数据成员声明为char *类型的指针,并为存储的字符串分配内存。
最简单的方法就是像这样声明数据成员estado

char estado[3];

存储字符串文字就足够了。

相关问题