使用c语言进行堆栈操作[已关闭]

gr8qqesn  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(101)

**已关闭。**此问题为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;
}

谁能告诉我为什么这个代码不工作?

insrf1ej

insrf1ej1#

问题出在以下几行:

struct stack* s;
s->size = 5;
s->top = -1;
s->arr = (int*)malloc(s->size * sizeof(int));

根据->运算符的定义,行

s->size = 5;

相当于:

(*s).size = 5;

这意味着您的代码正在尝试取消引用s指向的对象,并为其成员之一赋值。要使此操作正常工作,指针s必须指向有效对象。然而,情况并非如此。您从未为s赋值,因此它很可能未指向有效对象。
为了让s指向一个有效的对象,你有几个选择。你可以创建一个局部变量,让s指向该对象:

int main( void )
{
    struct stack object;

    struct stack *s = &object;
    s->size = 5;
    s->top = -1;
    s->arr = malloc( s->size * sizeof(int) );

    [...]

或者你可以使用malloc分配必要的内存,并使s指向该内存:

int main( void )
{
    struct stack *s = malloc( sizeof *s );
    s->size = 5;
    s->top = -1;
    s->arr = malloc( s->size * sizeof(int) );

    [...]

或者你可能想让s不是一个指针,而是一个普通对象:

int main( void )
{
    struct stack s;
    s.size = 5;
    s.top = -1;
    s.arr = malloc( s->size * sizeof(int) );

    [...]

与C++相反,在C中,不需要(and also not recommended)强制转换malloc的返回值。
此外,检查malloc的返回值通常是一个好主意,因为否则,如果malloc返回NULL,您的程序可能会崩溃。当malloc返回NULL时,最好退出错误消息,例如:

s.arr = malloc( s->size * sizeof(int) );
if ( s.arr == NULL )
{
    fprintf( stderr, "Memory allocation error!\n" );
    exit( EXIT_FAILURE );
}

此外,当您不再需要内存时,通常应该free内存。

jum4pzuy

jum4pzuy2#

使用未初始化的指针s访问内存

struct stack* s;
s->size = 5;
s->top = -1;

调用未定义的行为。
你可以动态地分配一个struct stack类型的对象,并把它的地址赋给指针s,但是动态地分配对象没有什么意义。
写起来比较简单

struct stack s = { 5, -1, malloc( 5 * sizeof(int) ) };

那么函数isEmpty也可以定义得更简单,如

int isEmpty( const struct stack *ptr ) 
{
    return ptr->top == -1;
}

叫做像

if ( isEmpty( &s ) ) {

当不再需要堆栈时,您需要释放为整数数组分配的内存,如

free( s.arr );

请注意,对于数据成员sizetop,最好使用无符号整数类型声明结构堆栈。

struct stack 
{
    size_t size;
    size_t top;
    int *arr;
};

要动态分配结构类型的对象,可以编写一个单独的函数,例如

struct stack * create_stack( size_t size )
{
    struct stack &s = malloc( sizeof( *s ) );

    if ( s != NULL )
    {
        s->size = 0;
        s->top = 0;
        s->arr = NULL;

        if ( size != 0 )
        {
             s->arr = malloc( size * sizeof( int ) );
             if ( s->arr != NULL )
             {
                 s->size = size;
             }
             else
             {
                 free( s );
                 s = NULL;
             }
        }
    }

    return s;
}

在main中你可以写

struct stack *s = create_stack( 5 );
//...

在本例中,函数isEmpty如下所示

int isEmpty( const struct stack *ptr ) 
{
    return ptr->top == 0;
}

并且类似于例如isFull的函数看起来像

int isFull( const struct stack *ptr ) 
{
    return ptr->top == ptr->size;
}

在main中调用函数,如

if ( isEmpty( s ) ) {
//...

if ( isFull( s ) ) {
//...
7lrncoxx

7lrncoxx3#

你可以简单地让s不是指针,这样代码就变成如下:

#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 = malloc(s.size * sizeof(int));

    if (isEmpty(s)) {
        printf("Stack is Empty.");
    }
    else {
        printf("Stack is not Empty");
    }

    return 0;
}

相关问题