错误:从"无效*"到"node_t*"的转换无效



每当我尝试运行下面的代码时,我都会在第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

相关内容

  • 没有找到相关文章