微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从'void *'对'int'的赋值使指针从整数开始而无需强制转换

如何解决从'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 举报,一经查实,本站将立刻删除。