所以我正在尝试构建一个可以接受任何数据类型的链表,更像是一个非同类列表。
#define CNode malloc (sizeof(listnode));
#define CNodeContent malloc (sizeof(content));
typedef enum datatypes {
CHAR,
INT ,
FLOAT,
STRING,
LIST
}datatype;
typedef struct contentInfo {
void *data;
datatype type;
}content;
typedef struct node {
content* val;
struct node *next;
} listnode;
typedef listnode* list;
// Creating content
//----------------------------------------------------------------------------------------------
content* createContentInt(int val) {
content *newContent = CNodeContent;
newContent->type= INT;
newContent->data = &val;
return newContent;
}
content* createContentFloat(float val) {
content *newContent = CNodeContent;
newContent->type= FLOAT;
(newContent->data) = &val;
return newContent;
}
content* createContentChar(char val) {
content *newContent = CNodeContent;
newContent->type= CHAR;
newContent->data = &val;
return newContent;
}
content* createContentString(char* val) {
content *newContent = CNodeContent;
newContent->type= STRING;
newContent->data = val;
return newContent;
}
//---------------------------------------------------------------------------------------------
// List Functions
list createList(content *cont) {
list newnode = CNode;
printf("\n--%d--value: %d ",(cont->type),*((int*)cont->data));
newnode->val = cont;
printf("<leh %d >",(newnode->val->type));
newnode->next= NULL;
return newnode;
}
int main() {
list llist = createList(createContentInt(4));
content * c = createContentInt(5);
printf("Main-> %d <",(*(int*)c->data));
createList(c);
/* append(llist,c); */
/* display(llist); */
/* append(llist,createContentInt(5)); */
/* append(llist,createContentInt(6)); */
/* display(llist); */
return 0;
}
所以这就是问题所在:
当我拨打createContentInt(4)
时,它会正确返回内容节点,
但是,只要我使用相同的内容节点调用createList
或append
函数,就会将值data
设置为0
。
我检查了createContentInt
的返回值,除了在createList
或append
之外,一切都不正常。
此外,content->type
也有适当的值,但data
已失去。{/ p>
我对这个搜索论坛感到很痛苦,但似乎没有但似乎无法找到将值设置为0
的原因
。
我想到的另一件事是,如果我使用这样的东西:
newContent->data = (int*)4;
代码工作正常。有什么区别?
请某人,提供一些有关其无效的见解。 任何替代解决方案都会受到高度赞赏,但我更倾向于知道它为什么不起作用。
答案 0 :(得分:3)
newContent->data = &val;
您正在为data
分配函数参数的ADDRESS(位于堆栈中)。
如果通过连续调用重新使用保留val
的寄存器,则会覆盖data
的内容。
更一般地说,退出该功能后,val
的地址可以在闲暇时重复使用,因此data
将指向垃圾。
相反,你可以,例如:
newContent->data = malloc(sizeof(TYPE)); // Set TYPE to INT/CHAR/...
// test return of malloc
memcpy(newContent->data, &val, sizeof(TYPE));
// Note that you will need an extra function to free() the allocated memory