gpt4 book ai didi

c - 进程退出并在 Malloc 或 File 上返回值 3221225477

转载 作者:行者123 更新时间:2023-11-30 14:46:24 33 4
gpt4 key购买 nike

那里。 ^^当我开始对 malloc 进行一些操作时,我一直在做一个小项目来帮助我做一些简单的事情,在家里练习。我从这段代码开始,完成后,尝试运行它,但它不打印任何内容并给出此退出:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#define imprime toString
#define erro printf("\n\nCaractere invalido! Digite novamente!\n\n")

//Programa de administração de Conta por mês
//Configurações: Full Manuel, contas simples, armazenamento em arquivo, criação de usuário simples

typedef struct
{
char* texto;
}String;

typedef struct
{
String nome[100];
float preco;
time_t data;
}Conteudo;

struct celula
{
Conteudo compra;
struct celula* prox;
};

typedef struct celula Celula;

//Operacoes com lista Ligada

Celula* criaLista()
{
Celula* nova = malloc(sizeof(Celula));
return nova;
}

int checaTamanhoLista(Celula* cabecaLista)
{
int cont=0;
Celula* teste;
for(teste = cabecaLista; teste->prox != NULL; teste = teste->prox)
{
cont++;
}return cont;
}

Celula* retornaFim(Celula* cabecaLista)
{
Celula* verif = cabecaLista;
while(verif->prox != NULL)
{
verif = verif->prox;
}return verif;
}

Celula* buscaCelulaAnt(Celula* cabecaLista, String* nome)
{
Celula* verif = cabecaLista;
while(verif->prox!=NULL)
{
if(strcmp(verif->prox->compra.nome->texto, nome->texto)==0)
{
return verif;
}
verif = verif->prox;
}return NULL;
}

Celula* buscaCelula(Celula* cabecaLista, String* nome)
{
Celula* verif = cabecaLista;
while(verif->prox!=NULL)
{
if(strcmp(verif->prox->compra.nome->texto, nome->texto)==0)
{
return verif->prox;
}
verif = verif->prox;
}return NULL;
}

void adicionaCelula(Celula* cabecaLista, Celula* c)
{
retornaFim(cabecaLista)->prox = c;
c->prox = NULL;
}

void adicionaCelulaMeio(Celula* cabecaLista, Celula* c, String* nome)
{
Celula* teste = buscaCelula(cabecaLista, nome);
c->prox = teste->prox;
teste->prox = c;
}

void removeCelula(Celula* cabecaLista, String* nome)
{
Celula* teste = buscaCelulaAnt(cabecaLista, nome);
Celula* limpar = teste->prox;
teste->prox = teste->prox->prox;
free(limpar);
}

//Operacoes de Elemento

Celula* criaCelula(String* nome, float preco, time_t data)
{
Celula* nova = malloc(sizeof(Celula));
fflush(stdin);
sprintf(nova->compra.nome->texto, "%s ", nome->texto);
nova->compra.preco = preco;
nova->compra.data = data;
return nova;
}

char* toStringLista(Celula* cabecaLista)
{
Celula* teste;
char* nome;
char* temp;
for(teste = cabecaLista; teste->prox!= NULL; teste = teste->prox)
{
fflush(stdin);
sprintf(temp, "%s - %.2f - %s\n", teste->compra.nome, teste->compra.preco, ctime(&teste->compra.data));
strcat(nome, temp);
fflush(stdin);
sprintf(temp, "");
}return nome;
}

char* toStringCelula(Celula* cabecaLista, String* nome)
{
Celula* temp = buscaCelula(cabecaLista, nome);
char* string;
fflush(stdin);
sprintf(string, "%s - %.2f - %s\n", temp->compra.nome, temp->compra.preco, ctime(&temp->compra.data));
return string;
}

void corrigirPreco(Celula* c, float preco)
{
c->compra.preco = preco;
}

void corrigirNome(Celula* c, char* nome)
{
fflush(stdin);
strcpy(c->compra.nome->texto, nome);
}

//Operações de Arquivo

void tornarDat(String* nome)
{
fflush(stdin);
strcat(nome->texto, ".dat");
}

void criarArquivo(char* nome)
{
FILE* arq = fopen(nome, "w");
fclose(arq);
}

void lerArquivo(Celula* cabecaLista, String* nomeLista, String* nomeTam, String* nomeOrc, float* orcamento, int* tamanhoLista)
{
FILE* arqTam = fopen(nomeTam->texto, "rb");
fread(tamanhoLista, sizeof(int), 1, arqTam);
fclose(arqTam);

FILE* arqOrc = fopen(nomeOrc->texto, "rb");
fread(orcamento, sizeof(float), 1, arqOrc);
fclose(arqOrc);

Conteudo v[*tamanhoLista];

FILE* arqLista = fopen(nomeLista->texto, "rb");
fread(v, sizeof(Conteudo), *tamanhoLista, arqLista);
int i;
for(i=0; i<*tamanhoLista; i++)
{
adicionaCelula(cabecaLista, criaCelula(v[i].nome, v[i].preco, v[i].data));
}
fclose(arqLista);
}

void salvarArquivos(Celula* cabecaLista, String* nomeTam, String* nomeLista, String* nomeOrc, float* orc)
{
int i;
int* tam = malloc(sizeof(int));
*tam = checaTamanhoLista(cabecaLista);
Conteudo v[*tam-1];
for(i=0; i<*tam-1; i++)
{
if(cabecaLista->prox!=NULL)
v[i] = cabecaLista->prox->compra;
}

FILE* arqOrc = fopen(nomeOrc->texto, "w");
fwrite(orc, sizeof(float), 1, arqOrc);
fclose(arqOrc);

FILE* arqTam = fopen(nomeTam->texto, "w");
fwrite(tam, sizeof(int), 1, arqTam);
fclose(arqTam);

FILE* arqList = fopen(nomeLista->texto, "w");
fwrite(v, sizeof(Conteudo), *tam-1, arqList);
fclose(arqList);

free(tam);
}

//Execuções de sistema

void limpaRam(Celula* cabecaLista)
{
Celula* teste;
for(teste = cabecaLista; teste!=NULL; teste = teste->prox)
{
free(teste);
}
}

void atualizaOrcamento(Celula* c, float* orcamento, int x)
{
if(x==0)
{
*orcamento -= c->compra.preco;
}else if(x==1)
{
*orcamento += c->compra.preco;
}
}

void startDatabase(String* nomeLista, String* nomeTam, String* nomeOrc)
{
FILE* arqList, *arqTam, *arqOrc;
arqList = fopen(nomeLista->texto, "rb");
if(arqList == NULL)
{
arqList = fopen(nomeLista->texto, "w");
}
arqTam = fopen(nomeTam->texto, "rb");
if(arqTam == NULL)
{
arqTam = fopen(nomeTam->texto, "w");
}
arqOrc = fopen(nomeOrc->texto, "rb");
if(arqOrc == NULL)
{
arqOrc = fopen(nomeOrc->texto, "w");
}
fclose(arqList);
fclose(arqTam);
fclose(arqOrc);
}

void startAll(Celula* lista, String* nomeArquivoLista, String* nomeArquivoTam, String* nomeArquivoOrc)
{
startDatabase(nomeArquivoLista, nomeArquivoTam, nomeArquivoOrc);
lerArquivo(lista, nomeArquivoLista, nomeArquivoTam, nomeArquivoOrc, orc, tamLista);
}
//Funcoes menu

void adicionaCompra(Celula* cabecaLista, String* nomeDaCompra, float* preco, time_t data, String* arquivoLista, String* arquivoTam, String* arqOrc, float* orc)
{
adicionaCelula(cabecaLista, criaCelula(nomeDaCompra, *preco, data));
atualizaOrcamento(buscaCelula(cabecaLista, nomeDaCompra), orc, 0);
salvarArquivos(cabecaLista, arquivoTam, arquivoLista, arqOrc, orc);
}

void removeCompra(Celula* cabecaLista, String* nomeDaCompra, String* arquivoLista, String* arquivoTam, String* arqOrc, float* orc)
{
atualizaOrcamento(buscaCelula(cabecaLista, nomeDaCompra), orc, 1);
removeCelula(cabecaLista, nomeDaCompra);
salvarArquivos(cabecaLista, arquivoTam, arquivoLista, arqOrc, orc);
}

void menu(char* resp)
{
printf("Responda com a primeira letra da Função:\n ->Adicionar Compra\n ->RemoverCompra\n ->Sair\n\n =>");
scanf("%c", resp);
}

void menuAdiciona(String* nomeVariante, float* precoVariante)
{
fflush(stdin);
printf("Diga o que voce comprou: ");
gets(nomeVariante->texto);
printf("\nDiga o preco: ");
scanf("%f", precoVariante);
getchar();
}

void menuRemove(String* nomeVariante)
{
fflush(stdin);
printf("Digite o nome da compra a remover (exit para sair): ");
gets(nomeVariante->texto);
}

//Main

void main()
{
//Declarações

String* nomeDoArquivoLista = malloc(sizeof(String));
String* nomeDoArquivoTamanho = malloc(sizeof(String));
String* nomeDoArquivoOrcamento = malloc(sizeof(String));
String* nomeVariante = malloc(sizeof(String));
int* tamanhoLista = malloc(sizeof(int));
float* precoVariante = malloc(sizeof(float));
float* orcamento = malloc(sizeof(float));
char* resp = malloc(sizeof(char));
Celula* listaComCabeca = malloc(sizeof(Celula));
*orcamento = 600;
//Atribuições Padrão

sprintf(nomeDoArquivoLista->texto, "lista");
tornarDat(nomeDoArquivoLista);
sprintf(nomeDoArquivoTamanho->texto, "tam");
tornarDat(nomeDoArquivoTamanho);
sprintf(nomeDoArquivoOrcamento->texto, "orcamento");
tornarDat(nomeDoArquivoOrcamento);
startDatabase(nomeDoArquivoLista, nomeDoArquivoTamanho, nomeDoArquivoOrcamento);
lerArquivo(listaComCabeca, nomeDoArquivoLista, nomeDoArquivoTamanho, nomeDoArquivoOrcamento, orcamento, tamanhoLista);

//Execuções

do
{
system("cls");
menu(resp);
*resp = toupper(*resp);
switch(*resp)
{
case 'A':
menuAdiciona(nomeVariante, precoVariante);
adicionaCompra(listaComCabeca, nomeVariante, precoVariante, time(NULL), nomeDoArquivoLista, nomeDoArquivoTamanho, nomeDoArquivoOrcamento, orcamento);
break;
case 'R':
menuRemove(nomeVariante);
removeCompra(listaComCabeca, nomeVariante, nomeDoArquivoLista, nomeDoArquivoTamanho, nomeDoArquivoOrcamento, orcamento);
break;
case 'S':
salvarArquivos(listaComCabeca, nomeDoArquivoTamanho, nomeDoArquivoLista, nomeDoArquivoOrcamento, orcamento);
break;
default:
erro;
salvarArquivos(listaComCabeca, nomeDoArquivoTamanho, nomeDoArquivoLista, nomeDoArquivoOrcamento, orcamento);
break;
}
}while(*resp!='S');

//Fim
free(resp);
free(orcamento);

free(nomeVariante);
free(precoVariante);

limpaRam(listaComCabeca);
free(tamanhoLista);
free(nomeDoArquivoLista);
free(nomeDoArquivoTamanho);
free(nomeDoArquivoOrcamento);
}

除此之外,代码运行良好。该代码尝试组织本月的资金,它创建一个头链表并在其上添加费用。我已经仔细检查了每个 malloc 中所有缺少的 free() ,但仍然导致同样的问题。

最佳答案

您取消引用未初始化的内存,导致崩溃。

String* nomeDoArquivoLista = malloc(sizeof(String));String 对象分配一些内存,但该内存未初始化,因此 nomeDoArquivoLista->texto 可以有任何值。稍后,当您调用 sprintf(nomeDoArquivoLista->texto, "lista"); 时,您将此未初始化的值传递给将尝试写入该值的库函数。由于它获取的指针可能无效,因此会导致崩溃。

String 对象分配内存后,您需要为 texto 指向分配一些空间。

关于c - 进程退出并在 Malloc 或 File 上返回值 3221225477,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52322409/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com