c语言 - 如何修复从'void *'分配给'int'的整数转换的不兼容指针



我一直在尝试,但我得到这个消息'警告:不兼容的指针到整数转换分配给'int'源自'void *' [- int-conversion]node2->data = NULL;

我从讲座中得到了这段代码,所以我确信一些(或大多数)编译器或计算机可以编译这段代码,但我的不起作用。我使用mac os和visual studio代码,似乎NULL导致分割错误:11在我的情况下。我该怎么解决这个问题?

#include <stdio.h>
#include <stdlib.h> // malloc
typedef struct Node
{   
struct Node *next;
int data;
} Node;
Node *head;
void freeAll(Node *root)
{
Node *cur = head->next;
while(cur != NULL)
{
Node *next = cur->next;
free(cur);
cur = next;
}
}
int main(void)
{
head = (Node *)malloc(sizeof(Node));
Node *node1 = (Node *)malloc(sizeof(Node));
node1->data = 1;
Node *node2 = (Node *)malloc(sizeof(Node));
node2->data = 2;
head->next = node1;
node1->next = node2;
node2->data = NULL;
Node *cur = head->next;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
return 0;
}

这是因为您在node2->data=NULL处将NULL赋值为int的指针值。

警告不是问题所在。问题是链表的最后一个元素并不终止链表。它的next成员没有赋值,保持未确定的值。

node1->next = node2;
node2->data = NULL;   <<==== Error is here
Node *cur = head->next;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
return 0;
}

不能用NULL终止链表。可能是打错了应该是

node1->next = node2;
node2->next = NULL;
Node *cur = head->next;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
return 0;
}

https://godbolt.org/z/coYbG6

在此语句中

node2->data = NULL;

有一个错别字。必须有

node2->next = NULL;

您还忘记初始化head节点的数据成员data

head = (Node *)malloc(sizeof(Node));
//...
head->next = node1;

定义一个虚拟头节点不是一个好方法。

最好编写一个函数,在列表中插入新节点,而不是"手动"插入。创建节点

注意函数freeAll可以调用未定义的行为,因为一般情况下,指针head可以等于NULL。在这种情况下,在此语句中尝试使用空指针访问内存。

Node *cur = head->next;

函数中也没有使用参数root。如果您的列表基于全局变量head(这是一个坏主意),那么可以按照以下方式声明和定义函数

void freeAll( void )
{
while( head != NULL )
{
Node *tmp = head;
head = head->next;
free( tmp );
}
}

不依赖于全局变量的更一般的函数可以这样定义

void freeAll( Node **head )
{
while( *head != NULL )
{
Node *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
}

并被称为

freeAll( &head );

下面是一个示范程序,演示如何定义列表。

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{   
struct Node *next;
int data;
} Node;
int push_back( Node **head, int data )
{
Node *new_node = malloc( sizeof( Node ) );
int success = new_node != NULL;

if ( success )
{
new_node->next = NULL;
new_node->data = data;

while ( *head ) head = &( *head )->next;

*head = new_node;
}

return success;
}
void freeAll( Node **head )
{
while ( *head )
{
Node *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
}
void display( const Node *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d -> ", head->data );
}

puts( "null" );
}
int main(void) 
{
Node *head = NULL;
const int N = 10;

for ( int i = 0; i < N; i++ )
{
push_back( &head, i + 1 );
}

display( head );

freeAll( &head );

return 0;
}

程序输出为

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> null

相关内容

最新更新