条件跳转或移动取决于 LinkedList 中未初始化的值
Conditional jump or move depends on uninitialised value(s) in LinkedList
我不断收到函数 printList() 和 freeList() 的条件跳转或移动取决于 Valgrind 中未初始化的值。我读了几篇文章,问题是因为 head 在 malloc() 之后没有初始化,所以我在我的 createList() 函数中的 malloc 之后添加了 newList->head = NULL 。我不确定如何解决此错误。非常感谢任何帮助!我真的是 C 的新手所以我真的不知道问题是什么...
typedef struct node{
int year;
int win;
struct node* next;
}node_t;
typedef struct slist{
node_t* head;
int size;
}slist_t;
node_t* makeNode(int year, int win){
node_t* newNode = (node_t*) malloc(sizeof(node_t));
if (newNode == NULL){
return NULL;
}
newNode->year = year;
newNode->win = win;
return newNode;
}
void freeNode(node_t* node){
if (node == NULL){
return;
}
free(node);
}
slist_t* createList(){
slist_t* newList = (slist_t*) malloc(sizeof(slist_t));
if (newList == NULL){
return;
}
newList->head = (node_t*) malloc(sizeof(node_t));
newList->head = NULL;
newList->size = 0;
return newList;
}
node_t* addFirst(slist_t* list, int year, int win){
node_t* node = makeNode(year, win);
if (list == NULL){
return;
}
if (node == NULL){
return;
}
if (list->head == NULL){
list->head = node;
}
else{
node->next = list->head;
list->head = node;
}
list->size += 1;
return node;
}
void printList(slist_t* list){
if (list == NULL){
return;
}
node_t* itr = list->head;
while(itr != NULL){
printf("%d, %d wins\n", itr->year, itr->win);
itr = itr->next;
}
printf("\n");
}
void freeList(slist_t* list){
node_t* node = list->head;
while (node){
node_t* temp = node;
node = node->next;
free(temp);
}
free(list);
}
int main(){
slist_t* list = createList();
addFirst(list, 2014, 71);
addFirst(list, 2015, 78);
addFirst(list, 2016, 93);
addFirst(list, 2017, 93);
addFirst(list, 2018, 108);
printList(list);
freeList(list);
return 0;
}
问题是 makeNode
没有初始化 newNode->next
。如果它的值恰好为 0 (NULL
),一切正常,但尝试在 makeNode
中添加此语句,然后 运行 程序:
newNode->next = 1000000;
现在您更有可能遇到分段错误或其他一些奇怪的行为。所以添加这一行:
newNode->next = NULL;
不是你的问题,但这个分配序列会产生内存泄漏:
newList->head = (node_t*) malloc(sizeof(node_t));
newList->head = NULL;
分配内存后,您会立即失去对它的引用,方法是用 NULL
覆盖该引用。你应该放弃这两项任务中的第一项。第一个节点稍后创建,当您调用 addFirst
时,因此不应在此处分配任何节点。
我不断收到函数 printList() 和 freeList() 的条件跳转或移动取决于 Valgrind 中未初始化的值。我读了几篇文章,问题是因为 head 在 malloc() 之后没有初始化,所以我在我的 createList() 函数中的 malloc 之后添加了 newList->head = NULL 。我不确定如何解决此错误。非常感谢任何帮助!我真的是 C 的新手所以我真的不知道问题是什么...
typedef struct node{
int year;
int win;
struct node* next;
}node_t;
typedef struct slist{
node_t* head;
int size;
}slist_t;
node_t* makeNode(int year, int win){
node_t* newNode = (node_t*) malloc(sizeof(node_t));
if (newNode == NULL){
return NULL;
}
newNode->year = year;
newNode->win = win;
return newNode;
}
void freeNode(node_t* node){
if (node == NULL){
return;
}
free(node);
}
slist_t* createList(){
slist_t* newList = (slist_t*) malloc(sizeof(slist_t));
if (newList == NULL){
return;
}
newList->head = (node_t*) malloc(sizeof(node_t));
newList->head = NULL;
newList->size = 0;
return newList;
}
node_t* addFirst(slist_t* list, int year, int win){
node_t* node = makeNode(year, win);
if (list == NULL){
return;
}
if (node == NULL){
return;
}
if (list->head == NULL){
list->head = node;
}
else{
node->next = list->head;
list->head = node;
}
list->size += 1;
return node;
}
void printList(slist_t* list){
if (list == NULL){
return;
}
node_t* itr = list->head;
while(itr != NULL){
printf("%d, %d wins\n", itr->year, itr->win);
itr = itr->next;
}
printf("\n");
}
void freeList(slist_t* list){
node_t* node = list->head;
while (node){
node_t* temp = node;
node = node->next;
free(temp);
}
free(list);
}
int main(){
slist_t* list = createList();
addFirst(list, 2014, 71);
addFirst(list, 2015, 78);
addFirst(list, 2016, 93);
addFirst(list, 2017, 93);
addFirst(list, 2018, 108);
printList(list);
freeList(list);
return 0;
}
问题是 makeNode
没有初始化 newNode->next
。如果它的值恰好为 0 (NULL
),一切正常,但尝试在 makeNode
中添加此语句,然后 运行 程序:
newNode->next = 1000000;
现在您更有可能遇到分段错误或其他一些奇怪的行为。所以添加这一行:
newNode->next = NULL;
不是你的问题,但这个分配序列会产生内存泄漏:
newList->head = (node_t*) malloc(sizeof(node_t));
newList->head = NULL;
分配内存后,您会立即失去对它的引用,方法是用 NULL
覆盖该引用。你应该放弃这两项任务中的第一项。第一个节点稍后创建,当您调用 addFirst
时,因此不应在此处分配任何节点。