我正在做一个学校的项目,我已经完全停止了尝试为结构中的数组分配一些动态内存。
我的结构是:
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);
}
型
3条答案
按热度按时间ac1kyiln1#
在
main
中,你定义了一个Empresas
类型的对象Empresa
,它包含一个成员empresas
,该成员是指向Empresa
类型的指针。在程序中没有任何地方你设置empresas
成员指向任何东西。您必须分配内存来保存
Empresa
对象,并且必须设置empresas
成员指向该内存。随着要保存的Empresa
对象数量的增加,您可能需要重新分配更多内存。您必须重写代码来执行这些内存分配。zzlelutf2#
我看到的第一个问题是公司创建功能:
字符串
您正在分配'nClassificacoes'并在将其添加到结构中后进行分配。
在你的项目中考虑这些:
1.将代码在大的“do..while”和“if..else”作用域中分离,为它们创建新的函数。更容易发现错误,更容易修复错误,更容易让其他人理解。
1.在代码变得复杂之前,经常测试代码。
1.输入(大小、类型、内容等)
uyhoqukh3#
你的程序在这里崩溃
字符串
为什么?为什么?
型
empresas
是Empresa*
,看起来你期望在那里有一个数组。型
所以
empresas
没有指向任何东西。它甚至没有初始化。