- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
那里。 ^^当我开始对 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/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!