C-检查指针是否为null时进行分割故障



因此,每次我尝试检查指针变量是否为 NULL时都会得到此分割故障。错误来自这些代码中的这些代码,添加函数:

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 %un", listint);
    return *listint;
}
int add(IteratorInt *it, int v){
    node *n;
    n->val = v;
    n->next = NULL;
    n->prev = NULL;
    printf("func worksn");
    printf("n %dn", 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 %dn", lit.head.val);
    add(&lit, 15);
    printf("Node value %d", lit.tail.val);*/
    return 0;
}

你能告诉我这怎么了吗?以及如何解决?非常感谢。

在您的add函数中,变量n是一个非初始化的指针。因此,这不是检查it->head的问题。

if (it->head == NULL)

如果it 本身不是有效的指针(例如NULL)。

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

这采用指针n dereferences it。最有可能的结果是崩溃。

如果我删除if语句。上方的printf语句导致它 -> head工作正常

相信您是 Hard ,因为n->valprintf上方,并且 it 很可能会在之前崩溃您可以到printf

如果要打印地址使用%p和(void *)铸件。

printf("address made %pn", (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 %pn", (void *) listint);
    return listint;
}
int add(IteratorInt *it, int v){
    node *n;
    n->val = v;
    n->next = NULL;
    n->prev = NULL;
    printf("func worksn");
    printf("n %dn", 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 %dn", lit.head.val);
    add(&lit, 15);
    printf("Node value %d", lit.tail.val);*/
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新