因此,每次我尝试检查指针变量是否为 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->val
在printf
上方,并且 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;
}