每当我尝试检查指针变量是否为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;
}
你能告诉我它有什么问题吗?以及如何解决?非常感谢。
答案 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;
}