Valgrind:跳转或移动取决于分配内存时未初始化的值

时间:2012-11-08 19:22:18

标签: c memory-management valgrind

我似乎无法弄清楚为什么我会收到此错误。我运行valgrind,它说newNode =(NodeType *)malloc(sizeof(NodeType));正在创建错误,但我无法弄清楚为什么......基本上我要做的是初始化传入的大小为n的链表并将头设置为第一个节点。

typedef struct {
  int number;
  AnotherNodeType *anotherLinkedList;
} Type;

typedef struct Node{
  Type *data;
  struct Node *next;
} NodeType;


int main(){
  NodeType *nodePointer = NULL;
  initLinkedList(&nodePointer, 10);
  return 0;
}

void initLinkedList(NodeType **nodePointer, int n){
  int i;
  NodeType *prevNode, *newNode;
  prevNode = NULL;
  for (i = 0; i < n; i++){
    newNode = (NodeType *)malloc(sizeof(NodeType));
    newNode->data = (Type *)malloc(sizeof(Type));
    newNode->data->number = i;
    newNode->data->anotherLinkedList = NULL;
    if (prevNode == NULL){
      *nodePointer = newNode;
    }
    else{
      prevNode->next = newNode;
    }
    prevNode = newNode;
  }
}

2 个答案:

答案 0 :(得分:2)

您未在newNode->next初始化initLinkedList

答案 1 :(得分:2)

如上所述@aib,您没有初始化列表中最后一项的“下一个”元素。

你应该在malloc之后将它初始化为null。

问题是:当你遍历你的列表时,当你到达最后一个项目时,它的“下一个”值将是未初始化的,你可能会结束segfaulting,你必须将它初始化为null才能知道你'已到达列表的末尾。