每当我尝试运行下面的代码时,我都会在第34行收到以下错误:
错误:从"void*"到"node_t*"的转换无效
我是指针和链表的新手,我正在看一个关于如何使用它们的教程(本教程:在C和Java中理解和实现链表(,我复制了大部分内容,就像视频中显示的一样,但它仍然不起作用。
我该怎么修?
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <math.h>
#include <iostream>
using namespace std;
typedef struct node {
int value;
struct node *next;
} node_t;
void printlist(node_t *head){
node_t *temporary = head;
while(temporary != NULL){
cout << temporary -> value << endl;
temporary = temporary -> next;
}
cout << endl;
}
node_t *create_new_node(int value){
node_t *result = malloc(sizeof(node_t)); // <----- line 34
result->value = value;
result->next = NULL;
return result;
}
int main()
{
setlocale(LC_ALL, "portuguese");
node_t *head;
node_t *tmp;
tmp = create_new_node(32);
head = tmp;
tmp = create_new_node(8);
tmp->next = head;
head = tmp;
tmp = create_new_node(34);
tmp->next = head;
head = tmp;
printlist(head);
return 0;
}
很可能您已经复制了List的C
示例,并试图将其转换为C++。
此行:
node_t *result = malloc(sizeof(node_t));
在C中有效,因为在C中允许从void*
到其他类型指针的隐式转换。注意,malloc
返回类型为void*
。
在C++中,void*
被更严格地处理,并且这种隐式转换已经被放弃。
修复它的一种方法是用运算符new
替换malloc
,正如另一个答案所建议的那样(不会复制它(。
另一种方法是应用转换node_t *result = (node_t *)malloc(sizeof(node_t));
,但这并不好,语言纯粹主义者可能会抱怨UB。
如果你学习更多的现代C++并使用std::unique_ptr
,那将是最好的。类似这样的东西:
#include <iostream>
#include <memory>
using namespace std;
struct node {
int value;
std::unique_ptr<node> next;
};
void printlist(node *head)
{
auto *p = head;
while(p != NULL){
cout << p->value << 'n';
p = p->next.get();
}
cout << 'n';
}
std::unique_ptr<node> create_new_node(int value){
return std::unique_ptr<node>{new node{value}};
}
void list_insert(std::unique_ptr<node>& head, int value)
{
auto tmp = create_new_node(value);
tmp->next = std::move(head);
head = std::move(tmp);
}
int main()
{
std::unique_ptr<node> head;
list_insert(head, 32);
list_insert(head, 8);
list_insert(head, 34);
printlist(head.get());
return 0;
}
https://godbolt.org/z/bWbva44fa
用新替换malloc
也许阅读https://www.geeksforgeeks.org/malloc-vs-new/
注意行
node_t *result = new node_t;
在下面的代码中
#include <iostream>
using namespace std;
typedef struct node {
int value;
struct node *next;
} node_t;
void printlist(node_t *head){
node_t *temporary = head;
while(temporary != NULL){
cout << temporary -> value << endl;
temporary = temporary -> next;
}
cout << endl;
}
node_t *create_new_node(int value){
node_t *result = new node_t;
result->value = value;
result->next = NULL;
return result;
}
int main()
{
setlocale(LC_ALL, "portuguese");
node_t *head;
node_t *tmp;
tmp = create_new_node(32);
head = tmp;
tmp = create_new_node(8);
tmp->next = head;
head = tmp;
tmp = create_new_node(34);
tmp->next = head;
head = tmp;
printlist(head);
return 0;
}
godbolt 的运行版本
https://godbolt.org/z/7PvohY4b5