C - 检查指针是否为NULL时出现分段错误

时间:2017-12-11 00:42:02

标签: c segmentation-fault

每当我尝试检查指针变量是否为NULL时,都会出现此分段错误。错误来自add function中的这些代码行:

if (it->head == NULL){
        printf("worksfine");
    }

这是我的整个代码:

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

typedef struct Node{
    int val;
    struct Node *prev;
    struct Node *next;
} node;

typedef struct IteratorInt{
    node *head;
    node *tail;
    node *last;
} IteratorInt;

IteratorInt IteratorIntNew(){
    IteratorInt *listint;
    listint = malloc(sizeof(IteratorInt));
    listint->head = NULL;
    listint->tail = NULL;
    listint->last = NULL;
    printf("address made %u\n", listint);
    return *listint;
}

int add(IteratorInt *it, int v){
    node *n;
    n->val = v;
    n->next = NULL;
    n->prev = NULL;
    printf("func works\n");
    printf("n %d\n", n->val);
    printf("address %u", it);
    it->head = n;
    printf("result %d", it->head->val);
    if (it->head == NULL){
        printf("worksfine");
    }
   /* if (it->head == 0){
       it->head = n;
    }
    if (it->tail == 0){
        it->tail = n;
    }
    if (it->last == 0){
        it->last = n;
    }*/

    return 1;
}

int main() {
    IteratorInt lit = IteratorIntNew();
    printf("works %u", &lit);
    add(&lit, 10);

    /*printf("Node value %d\n", lit.head.val);
    add(&lit, 15);
    printf("Node value %d", lit.tail.val);*/
    return 0;
}

你能告诉我它有什么问题吗?以及如何解决?非常感谢。

3 个答案:

答案 0 :(得分:2)

add函数中,变量n是未初始化的指针。所以这不是检查it->head的问题。

答案 1 :(得分:1)

  

if (it->head == NULL)

如果it 本身不是有效指针(例如NULL),这就会崩溃。

  

int add(IteratorInt *it, int v){ node *n; n->val = v;

这需要未初始化的指针n,并且取消引用它。最可能的结果是崩溃。

  

如果我删除if语句。它上面的printf语句导致它 - &gt; head工作正常

很难相信你,因为n->val高于printf很可能会崩溃之前你必须printf

答案 2 :(得分:1)

如果要打印地址,请使用%p和(void *)强制转换。

printf("address made %p\n", (void *) listint);
printf("address %p",(void *)  it);
printf("works %p",(void *)  &lit);

另外

node *n; // - is not initialized 
it->head = n;
printf("result %d", it->head->val); // will print garbage

IteratorIntNew()中正确分配内存。这是一种方式:

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

typedef struct Node{
    int val;
    struct Node *prev;
    struct Node *next;
} node;

typedef struct IteratorInt{
    node *head;
    node *tail;
    node *last;
} IteratorInt;

IteratorInt *IteratorIntNew(){
    IteratorInt *listint;
    listint = malloc(sizeof(IteratorInt));
    listint->head = NULL;
    listint->tail = NULL;
    listint->last = NULL;
    printf("address made %p\n", (void *) listint);
    return listint;
}

int add(IteratorInt *it, int v){
    node *n;
    n->val = v;
    n->next = NULL;
    n->prev = NULL;

    printf("func works\n");
    printf("n %d\n", n->val);
    printf("address %p",(void *)  it);

    it->head = n;
    printf("result %d", it->head->val);

    if (it->head == NULL){
        printf("worksfine");
    }

   /* if (it->head == 0){
       it->head = n;
    }
    if (it->tail == 0){
        it->tail = n;
    }
    if (it->last == 0){
        it->last = n;
    }*/

    return 1;
}

int main() {
    IteratorInt *lit = IteratorIntNew();
    printf("works %p",(void *)  lit);
    add(lit, 10);

    /*printf("Node value %d\n", lit.head.val);
    add(&lit, 15);
    printf("Node value %d", lit.tail.val);*/
    return 0;
}