【问题标题】:Process exited with return value 3221225477 on Malloc or File进程在 Malloc 或 File 上以返回值 3221225477 退出
【发布时间】:2018-09-13 22:07:17
【问题描述】:

那里。 ^^ 我一直在做一个小项目来帮助我做一些简单的事情,在家里练习,当我开始了解 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() ,但仍然会导致相同的问题。

【问题讨论】:

  • 很不清楚当所有标识符都是外语时代码在做什么......
  • 您是否尝试过使用gdb 来识别发生错误的行?
  • 我试图编译代码,但有几个错误,例如在函数startAll 中,找不到参数orc。等
  • 创建一个Minimal, Complete, and Verifiable example 并准确说明你卡在哪里。

标签: c malloc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2016-07-24
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多