我正在做一个学校项目,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);
}