结构指针丢失数据

时间:2017-01-11 13:20:27

标签: c pointers linked-list

所以我正在尝试构建一个可以接受任何数据类型的链表,更像是一个非同类列表。

#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)时,它会正确返回内容节点, 但是,只要我使用相同的内容节点调用createListappend函数,就会将值data设置为0

我检查了createContentInt的返回值,除了在createListappend之外,一切都不正常。

此外,content->type也有适当的值,但data已失去。{/ p>

我对这个搜索论坛感到很痛苦,但似乎没有但似乎无法找到将值设置为0的原因 。 我想到的另一件事是,如果我使用这样的东西:

newContent->data = (int*)4;

代码工作正常。有什么区别?

请某人,提供一些有关其无效的见解。 任何替代解决方案都会受到高度赞赏,但我更倾向于知道它为什么不起作用。

1 个答案:

答案 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