簡體   English   中英

如何調試此C代碼以實現堆棧?

[英]How to debug this C code for a stack implementation?

我是C編程新手。 我為堆棧練習編寫了一些代碼。 問題是:結果之一是錯誤的,但是當我一步一步調試時,數字突然改變了。 你能幫我解決這個問題嗎?

// @name mystack.c
// Created by lilei on 2017/3/10.
//
#include "mystack.h"
#include <malloc.h>
#include <stdio.h>

Stack createStack(){
    Stack stack = (Stack)malloc(sizeof(Stack));
    stack->top = -1;
    return stack;
}

int isFull(Stack s){
    if (s->top == MAXSIZE-1){
        return 1;
    } else{
        return 0;
    }
}

int push(Stack s, ElementType item){
    if(!isFull(s)){
        s->top++;
        s->data[s->top] = item;
        return 1;
    } else{
        printf("full!");
        return 0;
    }
}


int isEmpty (Stack s){
    if(s->top == -1){
        return 1;
    } else{
    return 0;
    }
}

ElementType pop(Stack s){
if(!isEmpty(s)){
    ElementType e = s->data[s->top];
    s->top--;
    return e;
}
}

void myPrintf(Stack s){
    int len = s->top;
     printf("The data are ");
   while(len >= 0){
        printf("%d ", s->data[len]);
        len--;
    }
    printf("\n");
}

int main(){
    Stack s = createStack();
    for(int i = 0; i < 7; i++){
        push(s, i*2);
    }
    myPrintf(s);

    printf("isEmpty:%d, isFull:%d\n, pop one:%d", isEmpty(s), isFull(s), pop(s));
}

結果是

在此處輸入圖片說明

我看不到Stack的聲明,因為您忘記將它放在第一個問題中,但是必須將其聲明為指向struct的指針,例如

typedef struct
{
    int top;
    ElementType data[MAXSIZE];
}  *Stack;
// ^- means pointer

因此,堆棧是一種指針類型,這意味着,當您對其進行malloc分配時,根據您是針對32位還是64位進行編譯,您只能分配4或8個字節。 malloc行應為

Stack stack = malloc(sizeof *stack);

您沒有在堆棧上為實際的堆棧結構分配足夠的空間,這意味着您正在寫入您不擁有的堆的位,並且其他事情將寫入您認為已為堆棧分配的內存中。

還有另一個問題。 如果在堆棧為空時嘗試彈出某些內容, pop()函數將返回什么? 答案是“可以是任何東西”。 您需要中止程序或返回一些錯誤值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM