我有以下C代码:
typedef struct DListNode_ {
void *data;
struct DListNode_ *prev;
struct DListNode_ *next;
} DListNode;
typedef struct DList_ {
int size;
DListNode *tail;
DListNode *head;
} DList;
void insert(DList * list, DListNode * element, int data) {
DListNode * new_element = (DListNode *)malloc(sizeof(DListNode));
new_element->data = &data;
if (list->head==NULL) {
list->head=list->tail=new_element;
list->size++;
return;
}
if(element == NULL) {
// handle size==0?
new_element->next=list->head;
list->head->prev=new_element;
list->head=new_element;
list->size++;
} else {
printf("Not yet implemented!\n");
}
}
void printNodes(DList *list) {
DListNode * pointer = list->head;
if (pointer!=NULL) {
int v= *((int*)pointer->data);
printf("Node has value: %d\n", v);
while (pointer->next != NULL) {
v = *((int*)pointer->data);
printf("Node has value: %d\n", v);
pointer=pointer->next;
}
}
}
int main(int argc, const char * argv[])
{
int e0 = 23;
int e1 = 7;
int e2 = 11;
DList *list = (DList *)malloc(sizeof(DList));
initList(list);
assert(count(list)==0);
insert(list, NULL, e0);
assert(count(list)==1);
insert(list,NULL, e1);
assert(count(list)==2);
insert(list,NULL, e2);
assert(count(list)==3);
printNodes(list);
return 0;
}
我有一些问题:
-
确实 *DListNode * new_element = (DListNode )malloc(sizeof(DListNode)); 也为数据,上下文,下一个指针分配空间还是我手动需要在每个指针上调用malloc?
-
当我在每个节点中打印数据指针的内容时,它们都具有值 3 ,即使我插入23,7和11并将数据指针设置为int的地址:** new_element-> data =&data; * * .
(已订购C简介教科书)
编辑:
insert now现在获取一个指向数据的void指针:
// Insert data as the new head
void insert(DList *list, DListNode *element, void *data) {
DListNode *new_element = malloc(sizeof(DListNode));
new_element->data = data;
if (list->head==NULL) {
list->head=list->tail=new_element;
list->size++;
return;
}
if(element == NULL) {
new_element->next=list->head;
list->head->prev=new_element;
list->head=new_element;
list->size++;
} else {
printf("Not yet implemented!\n");
}
}
在主要我做:
int main(int argc, const char * argv[])
{
int i0=7;
int *ip0 = malloc(sizeof(int));
ip0 = &i0;
int i1=8;
int *ip1 = malloc(sizeof(int));
ip1 = &i1;
int *ip2 = malloc(sizeof(int));
int i2=44;
ip2 = &i2;
DList *list = malloc(sizeof(DList));
initList(list);
// create some nodes
assert(count(list)==0);
insert(list, NULL, ip0);
assert(count(list)==1);
insert(list,NULL, ip1);
assert(count(list)==2);
insert(list,NULL, ip2);
assert(count(list)==3);
printNodes(list);
return 0;
}
哪个输出:
Node has value: 44
Node has value: 44
Node has value: 8
但它应该是:
Node has value: 44
Node has value: 8
Node has value: 7
2 回答
malloc(sizeof(DListNode))
为一个DListNode
分配空间,根据定义,它由void*
和两个DListNode
指针组成 . 但它并没有初始化那些指针 .您正在将
data
参数的地址分配给insert
. 这是一个指向临时的指针,一旦insert
返回就会失效 . 程序的行为未定义 . 简单的解决方案是将void *data
替换为int data
.您需要手动将这些指针设置为指向malloc的位置 . 没有它,它们将指向不是DListNode大小的空间 .
不要将数据作为指针 . 只需将数据设为int(它将自动分配),然后只设置data = data(传递给insert的数据) .