【问题标题】:Implementing Stacks using pointers使用指针实现堆栈
【发布时间】:2017-08-11 20:37:07
【问题描述】:

我正在尝试使用指针和结构来实现堆栈推送和弹出操作。此代码在第 40 行 (s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1));) 出现错误,提示分段错误。请帮忙

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>
    typedef long int StackEntry ;
    typedef int Boolean;

typedef struct stack{
    int top;
    int size;
    StackEntry *entry; //pointer to dynamic array
}Stack;
Boolean StackEmpty(Stack *s)
{
    return s->top<=0;
}
Boolean StackFull(Stack *s)
{
    return s->top >= s->size;
}
void Error(char *msg)
{
    puts(msg);
}
int StackSize(Stack *s)
{
    return s->top ;
}
void StackTop(StackEntry *item,Stack *s)
{
    *item=s->entry[s->top];
}
void CreateStack(Stack *s,int n)
{
    s->top=0;
    s->size=n;
    s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1)); 
}
void Push(StackEntry item,Stack *s)
{
    if(StackFull(s))
        Error("Stack is full");
    else s->entry[s->top++]=item;
}
int main() {

    int n;
    scanf("%d",&n);
    Stack *s;
    CreateStack(s,n);
    Push(10,s);
    //Push(15,s);
    return 0;
}

【问题讨论】:

  • 你检查过n的值吗
  • CreateStack(s,n); 这使用了未初始化的变量s
  • Stack *s = malloc(sizeof(Stack));
  • CeateStack 的第一个参数必须是“Stack **”。最初(在“main”中)“s”只是一个指向内存中某个随机位置的指针。然后您需要为“堆栈”分配内存,然后开始在其中写入值。
  • 提示:保持一致,始终将Stack *s作为第一个参数。

标签: c pointers data-structures structure


【解决方案1】:

尝试像这样更改您的 main() 函数:

int main() {                            
    int n;            
    scanf("%d",&n);   
    Stack s;          
    CreateStack(&s,n);
    Push(10,&s);      
    //Push(15,s);     
    return 0;         
}

正如 BLUEPIXY 所指出的,Stack *s 声明了一个指向Stack 结构的指针,而您想要的是一个新结构本身。如果您需要main() 范围之外的结构,您还可以声明堆栈指针,然后为其分配内存。

【讨论】:

    【解决方案2】:

    您正在取消引用 s,但它没有被初始化。

    替换

    Stack *s;
    CreateStack(s,n);
    Push(10,s);
    

    Stack s;
    CreateStack(&s,n);
    Push(10,&s);
    

    Stack *s = malloc(sizeof(Stack));
    CreateStack(s,n);
    Push(10,s);
    free(s);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 2013-01-20
      • 1970-01-01
      相关资源
      最近更新 更多