Правильное чтение символа из Int в C на стеке - PullRequest
0 голосов
/ 14 сентября 2010

так что я сейчас схожу с ума, читая символы из стека. Я храню char как int, так что я могу проверить сигнал EOF, но дела идут не так хорошо. Я новичок в реализации стеков, так что, вероятно, где-то что-то не так. Вот мой код.

Я получаю как неправильный верхний символ в стеке (он показывает -1, который является EOF вместо последнего введенного символа), так и некоторую ошибку памяти - «освобожденный указатель не выделен» , который ссылается на функцию destroyStack ().


int main( void ) {
    int *letter;
    STACK   *stack;

    stack = createStack();

    letter = (int *) malloc( sizeof( int ) );

    printf("Please enter the letters, each on a new line, or  to quit:\n");

    while ( *letter != EOF || stackFull( stack ) ) {
        *letter = getchar();

        if ( *letter != '\n' && *letter != ' ' && *letter != EOF ) {
            printf("Adding %c to the stack.\n", *letter);
            pushStack( stack, letter );
        }
    }

    free( letter );

    printf("Stack count is %i\n", stackCount(stack));

    letter = (int *) getStackTop( stack );

    printf("The top char is %i\n",  *letter);

    destroyStack( stack );

    return 0;
}

и мой код стека:


typedef struct node {
    void            *dataPointer;
    struct node     *link;
} NODE;

typedef struct {
    int     count;
    NODE    *top;
} STACK;

STACK* createStack() {
    STACK   *stack;

    stack = (STACK *) malloc( sizeof( STACK ) );

    if ( stack ) {
        stack->count    = 0;
        stack->top      = NULL;
    }

    return stack;
}

bool pushStack( STACK *stack, void  *pointerToData) {
    NODE    *newNode;

    newNode = (NODE *) malloc( sizeof( NODE ) );

    if ( !newNode ) {
        return false;
    }

    newNode->dataPointer    = pointerToData;
    newNode->link           = stack->top;
    stack->top              = newNode;

    ( stack->count )++;

    return true;
}

void* popStack( STACK *stack ) {
    void*   topData;
    NODE*   temp;

    if ( stack->count == 0 ) {
        topData = NULL; 
    } else {
        temp        = stack->top;
        topData     = stack->top->dataPointer;
        stack->top  = stack->top->link;

        free( temp );

        ( stack->count )--;
    }

    return topData;
}

void* getStackTop( STACK *stack ) {
    if ( stack->count == 0 ) {
        return NULL;
    } else {
        return stack->top->dataPointer;
    }
}

bool stackEmpty( STACK *stack ) {
    return ( stack->count == 0 );   
}

bool stackFull( STACK *stack ) {
    NODE    *temp;

    if ( ( temp = (NODE *) malloc( sizeof( *(stack->top) ) ) ) ) {
        free( temp );

        return false;
    }

    return true;
}

int stackCount( STACK *stack ) {
    return ( stack->count );
}

STACK* destroyStack( STACK *stack ) {
    NODE    *temp;

    if ( stack ) {
        while ( stack->top != NULL ) {
            free( stack->top->dataPointer );

            temp = stack->top;          
            stack->top = stack->top->link;

            free( temp );
        }

        free( stack );
    }

    return NULL;
}

Ответы [ 3 ]

3 голосов
/ 15 сентября 2010

Ваша проблема с письмом. Он выделяется только один раз, и когда вы помещаете его в стек, он не копирует. Вот почему ваш верхний указатель данных всегда является последним, что вы нажали. Затем вы освобождаете его, а destroyStack освобождает его, и вы получаете еще одну ошибку. Поскольку функции стека были из вашего назначения, исправление состоит в том, чтобы размещать новый указатель данных внутри цикла на каждой итерации и гарантировать, что он не освобождается за пределами destroyStack.

0 голосов
/ 15 сентября 2010

Посмотрите, сколько частей памяти размером с int вы выделили. Я думаю, вам нужно будет выделять новую для каждой записи, которую вы помещаете в стек.

0 голосов
/ 14 сентября 2010

Хорошо. , , похоже, вы дважды освобождаете указатель данных:

pushStack( stack, letter );
...
free( letter );
...
free( stack->top->dataPointer ); //(in destroyStack)

Итак, я бы начал с удаления строки free( letter ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...