在链表实现中调用strcpy()时如何解决分段错误?

吉尔赫姆·席尔瓦(Guilherme Silva)

我在这种结构上存在细分错误问题。我尝试使用strcpy将char值复制到列表结构,但没有用。


    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>

    typedef struct Elemento_FILA{
    // int cod_cliente, consumo, dia_venc, mes_venc, ano_venc;
    // float preco_un,valor_total;
    char nome_cliente[40];
    struct Elemento_FILA *proximo;
    } Elemento_Fila;

    typedef struct Fila{
    struct Elemento_FILA *inicio; 
    struct Elemento_FILA *fim; 
    } Fila;
    int escolha; 


    Fila* Criar_Fila(){

    Fila *f = (Fila*) malloc(sizeof(Fila));
    if(!f)
    exit(1);
    else {
    f->inicio = NULL; 
    f->fim = NULL; 
    }
    return f;
    }


    int Fila_Vazia(Fila *f){
    if(f==NULL) return 1; 
    if(f->inicio==NULL) return 1; 
    else return 0;
    }

    int Ler_Cod(){
    int cod;
    printf (" Digite o código para o cliente: ");
    scanf("%i",&cod);
    return cod;
    }

    char* Ler_Nome() {
    char* nome_cliente = malloc(40*sizeof(char));
    printf(" Digite o nome do cliente: ");
    scanf("%s", &nome_cliente);
    return nome_cliente;
    }

    int Ler_Consumo(){
    int consumo;
    printf (" Digite o consumo para o cliente: ");
    scanf("%i",&consumo);
    return consumo;
    }


    Elemento_Fila* Alocar(const char* nome){

    Elemento_Fila *no_fila = (Elemento_Fila*)malloc(sizeof(Elemento_Fila));

    if(!no_fila)
    exit(1);
    else{

    strcpy(no_fila->nome_cliente,nome); 


    return no_fila;
    }
    }

    void Enfileirar(Fila *f){
    Elemento_Fila *no_fila = Alocar(Ler_Nome());
    if(!no_fila) 
    exit(1);
    if(f->fim == NULL) 
    f->inicio = no_fila;
    else 
    f->fim->proximo = no_fila; 
    f->fim = no_fila; 
    }

    int Desenfileirar(Fila *f){

    if(Fila_Vazia(f)) return 0;

    Elemento_Fila *no_fila = f->inicio;

    f->inicio = f->inicio->proximo;

    if(f->inicio==NULL)
    f->fim = NULL;

    free(no_fila);
    return 1;
    }

    void Exibir_Fila(Fila *f){

    if(Fila_Vazia(f)){
    printf (" Fila Vazia!\n");
    printf ("\n Fila End. Inicio %p: ", f->inicio);
    printf ("\n Fila End. Fim %p: ", f->fim);
    return ;
    }

    Elemento_Fila *aux = f->inicio;
    printf ("\n Fila Atual: ");
    printf ("\n Fila End. Inicio %p: ", f->inicio);
    printf ("\n Fila End. Fim %p: ", f->fim);
    printf ("\n");

    while(aux!=NULL){
    printf ("\n\t  Nome: %s  \tEndereco: %p ==> %p", aux->nome_cliente, aux, aux->proximo);

    aux = aux->proximo;
    }
    printf ("\n");
    }

    void opcoes(int escolha, Fila *f){
    switch(escolha){
    case 1:
    Enfileirar(f);
    Exibir_Fila(f);
    break;
    case 2:
    Desenfileirar(f);
    Exibir_Fila(f);
    break;
    default:
    if (escolha!=0) printf (" Opção Inválida!\n");
    }
    }


    int menu(){
    printf ("\n Opções da Fila;\n");
    printf (" 0 Sair;\n");
    printf (" 1 Inserir na Fila;\n");
    printf (" 2 Retirar da Fila;\n");
    printf (" Escolha: ");
    scanf("%i", &escolha);
    return escolha;
    }

    int main (void){

    Fila *f = Criar_Fila();
    do{
    escolha = menu();
    opcoes(escolha,f);
    }while(escolha);
    return 0;
    }

阿敏

此方法:

char Ler_Nome() {
  char nome_cliente[40];
  printf(" Digite o nome do cliente: ");
  scanf("%s", &nome_cliente);
  return nome_cliente;
}

返回本地变量nome_cliente

由于nome_cliente是在堆栈上分配的,因此返回时该对象将消失。

这是一个严重的错误。永远不要这样做。

如果需要返回数组,则必须在堆上分配它:

char* Ler_Nome() {
  char* nome_cliente= malloc(40*sizeof(char));
  printf(" Digite o nome do cliente: ");
  scanf("%s", &nome_cliente);
  return nome_cliente;
}

请注意,创建destroyNome()函数也是一种很好的做法,因为负责创建的API也应负责其销毁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章