**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由一个错字或一个无法再复制的问题引起的。虽然类似的问题可能是on-topic在这里,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
谁能帮我为什么这个代码不工作?这段代码没有显示任何输出也没有任何错误.
#include <stdio.h>
#include <stdlib.h>
struct stack {
int size;
int top;
int* arr;
};
int isEmpty(struct stack* ptr) {
if (ptr->top == -1) {
return 1;
}
else {
return 0;
}
}
int main()
{
struct stack* s;
s->size = 5;
s->top = -1;
s->arr = (int*)malloc(s->size * sizeof(int));
if (isEmpty(s)) {
printf("Stack is Empty.");
}
else {
printf("Stack is not Empty");
}
return 0;
}
谁能告诉我为什么这个代码不工作?
3条答案
按热度按时间insrf1ej1#
问题出在以下几行:
根据
->
运算符的定义,行相当于:
这意味着您的代码正在尝试取消引用
s
指向的对象,并为其成员之一赋值。要使此操作正常工作,指针s
必须指向有效对象。然而,情况并非如此。您从未为s
赋值,因此它很可能未指向有效对象。为了让
s
指向一个有效的对象,你有几个选择。你可以创建一个局部变量,让s
指向该对象:或者你可以使用
malloc
分配必要的内存,并使s
指向该内存:或者你可能想让
s
不是一个指针,而是一个普通对象:与C++相反,在C中,不需要(and also not recommended)强制转换
malloc
的返回值。此外,检查
malloc
的返回值通常是一个好主意,因为否则,如果malloc
返回NULL
,您的程序可能会崩溃。当malloc
返回NULL
时,最好退出错误消息,例如:此外,当您不再需要内存时,通常应该
free
内存。jum4pzuy2#
使用未初始化的指针
s
访问内存调用未定义的行为。
你可以动态地分配一个
struct stack
类型的对象,并把它的地址赋给指针s
,但是动态地分配对象没有什么意义。写起来比较简单
那么函数
isEmpty
也可以定义得更简单,如叫做像
当不再需要堆栈时,您需要释放为整数数组分配的内存,如
请注意,对于数据成员
size
和top
,最好使用无符号整数类型声明结构堆栈。要动态分配结构类型的对象,可以编写一个单独的函数,例如
在main中你可以写
在本例中,函数
isEmpty
如下所示并且类似于例如
isFull
的函数看起来像在main中调用函数,如
和
7lrncoxx3#
你可以简单地让
s
不是指针,这样代码就变成如下: