我正在做一个学校项目,try 为 struct 中的数组分配一些动态内存的工作已经停止了.

我的 struct 是:

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;

我正在try 分配内存"分类法"(葡萄牙语判断),这将包含在一个企业(公司).我已经try 了所有的方法,但我得到的都是堆栈错误. 这是我的createCompany函数:

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)求值,然后我判断createEvaluation函数是否所有内存都已满,是否重新锁定它. 其功能如下:

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);
}

推荐答案

main中,定义一个类型为Empresas的对象Empresa,该对象包含一个成员empresas,该成员是指向该类型Empresa的指针.在程序中,您不会将empresas成员设置为指向任何内容.

必须分配内存才能容纳Empresa个对象,并且必须将empresas成员设置为指向该内存.随着要容纳的Empresa个对象的数量增加,您可能需要重新分配更多内存.您必须重写代码才能执行这些内存分配.

C++相关问答推荐

带双指针的2D数组

设计处理各种数据类型的方法和数据 struct

标准的C17标准是用括号将参数包装在函数声明中吗

为什么I2C会发送错误的数据?

模拟shell并运行.sh文件

正确的TCP/IP数据包 struct

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

在句子中转换单词的问题

在C++中父进程和子进程中的TAILQ队列同步问题

C代码在字符串中删除不区分大小写的子字符串的问题

如何在C中定义指向函数的指针并将该指针赋给函数?

为什么会出现此错误?二进制表达式的操作数无效

try 判断长整数是否为素数

`%%的sscanf无法按预期工作

通过char*访问指针的对象表示是未定义的行为吗?

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

'printf("%s", user_input)' 危险吗?

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

SSE 向量与 Epsilon 的比较

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度