如何解决从'void *'对'int'的赋值使指针从整数开始而无需强制转换
我正在尝试建立一个链表列表栈,并且我在网上遵循了一个教程,但是却收到此警告,而作者却没有。
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
typedef struct stack {
int data;
struct stack *next;
} stack;
stack *top;
void Initialize(stack *s){
s=malloc(sizeof(stack));
s->data=NULL;
s->next=NULL;
top=s;
return;
}
在调试过程中,如果我没有在初始化函数中使用malloc
,则会遇到分段错误。
MINGW-W64编译器。
解决方法
该警告是由于NULL
宏(由大多数现代编译器定义)为((void *)0)
的事实,因为它旨在仅用于指针。将此值分配给结构的data
成员会引起警告。
要删除此警告,请使用s->data=0;
代替s->data=NULL;
。本教程的作者 使用较旧的编译器或禁用了此特定警告。
此外,传递给s
函数的指针(Initialize
将是在调用该函数时用作参数的任何变量的副本这样,其值将在调用代码中 not 更新。您尚未指定打算如何使用该功能,但这是一个(可能)更好的实现:
stack* Initialize(void) { // Don't need an argument - just return the 'answer'
stack* made = malloc(sizeof(stack));
if (made) { // Don't attempt the initialization if "malloc" failed!
made->data = 0;
made->next = NULL;
}
return made;
}
然后,当您调用该函数时,可以将其返回值分配给“全局” top
指针:
//...
top = Initialize();
// You should check that 'top' is not NULL before continuing!
,
在C中,宏NULL的定义如下
( void * )0
即表达式的类型是void *
类型的空指针。
这句话
s->data=NULL;
将指针分配给int
类型的对象,编译器会发出一条消息,指出您做错了事。
函数Initialize编写起来没有意义。例如,以下所有语句
s=malloc(sizeof(stack));
不会更改用作函数参数的原始指针top
。
实际上,该功能是多余的。
尽管如此,如果要编写这样的函数,它可能看起来像是
stack * Initialize( void )
{
return NULL;
}
并称呼为
stack *top = Initialize();
或喜欢
void Initialize( stack **top )
{
*top = NULL;
}
或者对于一个新创建的节点,可以像这样声明和定义
void Initialize( stack *s,int data,stack *next )
{
s->data = data;
s->next = next;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。