【发布时间】:2021-02-08 14:55:46
【问题描述】:
我正在尝试制作一个链表堆栈,并且我按照在线教程进行操作,但是我收到了这个警告,而作者没有。
#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 编译器。
【问题讨论】:
-
您似乎遗漏了一些代码。这甚至没有 main,因此我们无法运行此代码来查看您的问题。
-
NULL通常(但不总是)定义为#define NULL ((void *)0),这将导致赋值s->data = NULL;中出现警告,因为s->data的类型为int。也许您应该改用s->data = 0;。另外,您没有显示函数Initialize是如何被调用的,但是与参数s对应的参数被函数忽略了。 -
要么函数
Initialize有问题,要么函数参数stack *s没用,应该用局部变量替换。传递给函数的值s立即被malloc的结果覆盖。Initialize的调用者不会得到修改后的值,因为指针s是按值传递的。第二个问题:你应该检查malloc的返回值。如果它返回一个NULL指针,那么下面对s->data和s->next的访问是无效的。 -
函数参数没有用,因为你将指针分配给全局
stack *top; -
@Sumsar 可见教程的作者是个低素质的程序员。:)