分段错误,指针问题

时间:2015-06-02 12:27:06

标签: c pointers

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

typedef struct lista_inteiros
{
    int valor;
    struct lista_inteiros *next;

}element_int;

void insere_inteiro(element_int **head, element_int **aux, int m);
void remove_inteiro(element_int **head, element_int **aux, int m);

int main()
{
    int i = 0;
    element_int *head, *aux;

    head = NULL;

    for(i = 0; i<6; i++)
    {
        insere_inteiro(&head, &aux, i); 
    }

    aux = head;

    while(aux)
    {
        printf("%d\n", aux->valor);
        aux = aux->next;
    }

    aux = head;
    i = 4;

    remove_inteiro(&head, &aux, i);

    aux = head;
    while(aux)
    {
        printf("%d\n", aux->valor);
        aux = aux->next;
    }


    return 0;
}

void insere_inteiro(element_int **head, element_int **aux, int m)
{
    (*aux) = (element_int*)malloc(sizeof(element_int));
    if((*aux) == NULL)
    {
        printf("Error\n");
        exit(1);
    }

    (*aux)->valor = m;
    (*aux)->next = (*head);
    (*head) = (*aux);
}

void remove_inteiro(element_int **head, element_int **aux, int m)
{
    element_int *del;

    while((*aux) != NULL)
    {
        if((*head)->valor == m)
        {
            (*head) = (*head)->next;
            free(aux);
            (*aux) = (*head);
        }

        else if((*aux)->next->valor == m)
        {
            del = (*aux)->next;
            (*aux)->next = del->next;
            free(del);
        }
        (*aux) = (*aux)->next;
    }
}

Baiscally,这打印:

5
4
3
2
1
0
Segmentation Fault

我真的无法弄清楚原因。它应该消除数字4,然后再次打印数字。所以期望的输出是:

5
4
3
2
1
0
5
3
2
1
0

函数insere_inteiro创建一个新元素,函数remove_inteiro删除一个元素。

列表的每个元素都有一个名为valor的整数。

2 个答案:

答案 0 :(得分:0)

您取消引用else if((*aux)->next->valor == m)中的下一个值而不检查存在

答案 1 :(得分:0)

您取消引用NULL,这是一个固定版本:

void draw() {
  background(0);
}

void keyPressed() {

  if (key==CODED) {
    if (keyCode == SHIFT){println("shift");}
    else if(keyCode == CONTROL){println("ctrl");}
    else if(keyCode == ALT) {println("alt");}
  } else {
    if (key == BACKSPACE) {
      println("1: backspace");
    } else if (key == DELETE) {
      println("2: delete");
    } else if (key == RETURN || key == ENTER) {
      println("4: return");
    } else {
      println("5: " + key);
    }
  }
}

/ *以下更改为在DEREFERENCE之前检查空值* /

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

typedef struct lista_inteiros
{
    int valor;
    struct lista_inteiros *next;

}element_int;

void insere_inteiro(element_int **head, element_int **aux, int m);
void remove_inteiro(element_int **head, element_int **aux, int m);

int main()
{
    int i = 0;
    element_int *head, *aux;

    head = NULL;

    for(i = 0; i<6; i++)
    {
        insere_inteiro(&head, &aux, i);
    }

    aux = head;

    while(aux)
    {
        printf("%d\n", aux->valor);
        aux = aux->next;
    }

    aux = head;
    i = 4;

    remove_inteiro(&head, &aux, i);

    aux = head;
    while(aux)
    {
        printf("%d\n", aux->valor);
        aux = aux->next;
    }


    return 0;
}

void insere_inteiro(element_int **head, element_int **aux, int m)
{
    (*aux) = (element_int*)malloc(sizeof(element_int));
    if((*aux) == NULL)
    {
        printf("Error\n");
        exit(1);
    }

    (*aux)->valor = m;
    (*aux)->next = (*head);
    (*head) = (*aux);
}

void remove_inteiro(element_int **head, element_int **aux, int m)
{
    element_int *del;

    while((*aux) != NULL)
    {
        if((*head)->valor == m)
        {
            (*head) = (*head)->next;
            free(aux);
            (*aux) = (*head);
        }