C语言 为结构中的数组动态分配内存时出错

lrpiutwd  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(139)

我正在做一个学校的项目,我已经完全停止了尝试为结构中的数组分配一些动态内存。
我的结构是:

typedef struct {
    int avaliacao;
    char nome[MAXG];
    char email [MAXG];
}Classificacao;

typedef struct {
    char nif[MAXG];
    char nome[MAXG];
    char categoria[MAXG];
    char ramo[MAXG];
    char rua[MAXBIG];
    char localidade[MAXG];
    char codigoPostal[MAXG];
    int estado;
    int nClassificacoes;
    int maxClassificacoes;
    Classificacao *classis;
    int nComentarios;
    Comentario *comment;
}Empresa;    
    
typedef struct {
    int contador;
    int alocadas;
    Empresa *empresas;
}Empresas;

字符串
我正在尝试为“Classificacao”(葡萄牙语中的评估)分配内存,这将包含在一个empresa(公司)中。我已经尝试了所有方法,但我得到的都是堆栈转储错误。这是我的公司函数:

void criarEmpresa(Empresas *catalogo, Ramos *catalogoRamos) {
    // Verifica se o número de empresas atingiu o limite atualmente alocado
    if (catalogo->contador == catalogo->alocadas) {
        // Se o limite for atingido, aloca mais espaço
        catalogo->alocadas += 10; 
        catalogo->empresas = realloc(catalogo->empresas, catalogo->alocadas * sizeof(Empresa));
    }

    Empresa novaEmpresa;

    // Solicita o NIF da empresa e verifica se é válido
    do{
        printf("Nif da empresa: ");
        scanf("%s", novaEmpresa.nif);
        if (!verificaNIF(novaEmpresa.nif))
        {
                printf("O NIF nao e valido.\n");
        }
    }while(!verificaNIF(novaEmpresa.nif));
    
    // Solicita o nome da empresa
    printf("Nome da empresa: ");
    scanf(" %[^\n]", novaEmpresa.nome);
    
    // Solicita a categoria da empresa e verifica se é válida
    do {
        printf("Categoria da empresa(Micro, PME ou GrandeEmpresa): ");
        scanf("%s", novaEmpresa.categoria);
    }while(!verificaCategoria(novaEmpresa.categoria));
    
    // Solicita a rua da empresa
    printf("Rua da empresa: ");
    scanf(" %[^\n]", novaEmpresa.rua);
    // Solicita a localidade da empresa
    printf("Localidade da empresa: ");
    scanf("%s", novaEmpresa.localidade);
    
    // Solicita o código postal da empresa e verifica se é válido
    do{
        printf("Codigo postal da empresa: ");
        scanf("%s", novaEmpresa.codigoPostal);
        if (!verificaCodigoPostal(novaEmpresa.codigoPostal)) 
        {
            printf("O NIF nao e valido.\n");
        }
    }while(!verificaCodigoPostal(novaEmpresa.codigoPostal));

    // Se existirem ramos de atividade, solicita que o usuário escolha um para a empresa
    if(catalogoRamos->contador > 0) {
        for(int i = 0; i < catalogoRamos->contador; i++) {
            printf("%d. %s\n", i+1, catalogoRamos->ramos[i].nome);
        }
        int escolha;
        do {
            printf("Escolha o ramo de atividade da empresa (1-%d): ", catalogoRamos->contador);
            scanf("%d", &escolha);
        } while(escolha < 1 || escolha > catalogoRamos->contador);
        strcpy(novaEmpresa.ramo, catalogoRamos->ramos[escolha-1].nome);
    } else {
        // Se não existirem ramos de atividade, informa o usuário e retorna
        printf("Nao existem ramos de atividade disponíveis. Por favor, crie um ramo de atividade antes de criar uma empresa.\n");
        return;
    }

       
    // Define o estado da empresa como ativo
    novaEmpresa.estado = 1;
    
    // Adiciona a nova empresa ao catálogo
    catalogo->empresas[catalogo->contador] = novaEmpresa;
    catalogo->contador++;
    
    // Inicializa o array de classificações
    novaEmpresa.nClassificacoes = 0;
    novaEmpresa.maxClassificacoes = MAX_CLASSIFICACOES;
    novaEmpresa.classis = malloc(novaEmpresa.maxClassificacoes * sizeof(Classificacao));
    
    // Informa ao usuário que a empresa foi criada com sucesso
    printf("Empresa criada com sucesso!\n");
}


正如你所看到的,我分配MAX_CLASSIFICACOES(值为10)评估,然后我检查是否所有内存都已满,如果它是realloc它。函数如下:

void classificarEmpresa(Empresas *catalogo) {
    char nif[MAXG];
    int avaliacao;
    Classificacao novaClassificacao;

    // Solicita o NIF da empresa a ser classificada
    printf("NIF da empresa a ser classificada: ");
    scanf("%s", nif);

    // Procura a empresa no catálogo
    for(int i = 0; i < catalogo->contador; i++) {
        if(strcmp(catalogo->empresas[i].nif, nif) == 0) {
            // Solicita a avaliação do usuário
            do {
                printf("Avaliacao (0-5): ");
                scanf("%d", &avaliacao);
            } while(avaliacao < 0 || avaliacao > 5);

            // Verifica se o número de classificações atingiu o limite atualmente alocado
            if (catalogo->empresas[i].nClassificacoes == catalogo->empresas[i].maxClassificacoes) {
                // Se o limite for atingido, aloca mais espaço
                catalogo->empresas[i].maxClassificacoes += MAX_CLASSIFICACOES;
                Classificacao *temp = realloc(catalogo->empresas[i].classis, catalogo->empresas[i].maxClassificacoes * sizeof(Classificacao));
                
                if(temp == NULL) {
                    printf("Erro na alocacao de memoria.\n");
                    return;
                }
                
                catalogo->empresas[i].classis = temp;
            }

            // Adiciona a avaliação à lista de classificações da empresa
            novaClassificacao.avaliacao = avaliacao;
            catalogo->empresas[i].classis[catalogo->empresas[i].nClassificacoes] = novaClassificacao;
            catalogo->empresas[i].nClassificacoes++;

            printf("Avaliacao adicionada com sucesso!\n");
            return;
        }
    }

    printf("Empresa nao encontrada.\n");
}


请注意,创建公司工作完美,没有任何问题。谢谢,提前。
最小的,可复制的示例(没有用户输入。它创建一个公司,然后尝试审查它):

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

#define MAXG 50
#define MAXBIG 200
#define MAX_AVALS 10

   
typedef struct {
    int avaliacao;
}Classificacao;

typedef struct {
    char nif[MAXG];
    char nome[MAXG];
    int nClassificacoes;
    int maxClassificacoes;
    Classificacao *classis;
}Empresa;    
    
typedef struct {
    int contador;
    int alocadas;
    Empresa *empresas;
}Empresas;

void classificarEmpresa(Empresas *catalogo) {
    char nif[MAXG] = "123456789"; // NIF hardcoded
    int avaliacao = 5; // Avaliação hardcoded
    Classificacao novaClassificacao;

    // Procura a empresa no catálogo
    for(int i = 0; i < catalogo->contador; i++) {
        if(strcmp(catalogo->empresas[i].nif, nif) == 0) {
            // Adiciona a avaliação à lista de classificações da empresa
            novaClassificacao.avaliacao = avaliacao;
            catalogo->empresas[i].classis[catalogo->empresas[i].nClassificacoes] = novaClassificacao;
            catalogo->empresas[i].nClassificacoes++;

            printf("Avaliacao adicionada com sucesso!\n");
            return;
        }
    }

    printf("Empresa nao encontrada.\n");
}

void criarEmpresa(Empresas *catalogo) {
    Empresa novaEmpresa;

    strcpy(novaEmpresa.nif, "123456789"); // NIF hardcoded
    strcpy(novaEmpresa.nome, "Empresa XYZ"); // Nome da empresa hardcoded
    
    // Adiciona a nova empresa ao catálogo
    catalogo->empresas[catalogo->contador] = novaEmpresa;
    catalogo->contador++;
    
    // Inicializa o array de classificações
    novaEmpresa.nClassificacoes = 0;
    novaEmpresa.maxClassificacoes = MAX_AVALS;
    novaEmpresa.classis = malloc(novaEmpresa.maxClassificacoes * sizeof(Classificacao));
    
    // Informa ao usuário que a empresa foi criada com sucesso
    printf("Empresa criada com sucesso!\n");
}

int main() {
    
    Empresas Empresa = {.contador = 0};
    
    int opc = 1;
    do {
        switch (opc) {
            case 1:
                criarEmpresa(&Empresa);
                opc = 2; 
                break;
            case 2:
                classificarEmpresa(&Empresa);
                opc = 3;
                break;
            case 3:
                opc = 4;
                break;
        }
    } while (opc != 4);
}

ac1kyiln

ac1kyiln1#

main中,你定义了一个Empresas类型的对象Empresa,它包含一个成员empresas,该成员是指向Empresa类型的指针。在程序中没有任何地方你设置empresas成员指向任何东西。
您必须分配内存来保存Empresa对象,并且必须设置empresas成员指向该内存。随着要保存的Empresa对象数量的增加,您可能需要重新分配更多内存。您必须重写代码来执行这些内存分配。

zzlelutf

zzlelutf2#

我看到的第一个问题是公司创建功能:

Empresa novaEmpresa;// in stack memory
// ...
    catalogo->empresas[catalogo->contador] = novaEmpresa;// this has written into structure
    catalogo->contador++;
    
    novaEmpresa.nClassificacoes = 0;// these does not affect the variable in the structure
    novaEmpresa.maxClassificacoes = MAX_CLASSIFICACOES;
    novaEmpresa.classis = malloc(novaEmpresa.maxClassificacoes * sizeof(Classificacao));

字符串
您正在分配'nClassificacoes'并在将其添加到结构中后进行分配。
在你的项目中考虑这些:

  1. Linked Lists,这样你就不必每次都重新锁定。
    1.将代码在大的“do..while”和“if..else”作用域中分离,为它们创建新的函数。更容易发现错误,更容易修复错误,更容易让其他人理解。
    1.在代码变得复杂之前,经常测试代码。
    1.输入(大小、类型、内容等)
uyhoqukh

uyhoqukh3#

你的程序在这里崩溃

catalogo->empresas[catalogo->contador] = novaEmpresa;

字符串
为什么?为什么?

typedef struct
{
    int      contador;
    int      alocadas;
    Empresa* empresas;
} Empresas;


empresasEmpresa*,看起来你期望在那里有一个数组。

Empresas Empresa = {.contador = 0};


所以empresas没有指向任何东西。它甚至没有初始化。

相关问题