Массив становится поврежденным между вызовами функций - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь реализовать структуру данных стека, используя массив.Когда я вызываю функцию push () в первый раз, она работает нормально.Но когда я вызываю его во второй раз, я получаю ошибку сегментации в операторе: - *stack[*tos] = data;

Возможно, причина этого в том, что массив поврежден.Я обнаружил эту причину, когда выполнил функцию pop ().Он изменяет все элементы, кроме того, который высовывается.Я присваиваю '0' вытолкнутому элементу.

Вот весь код:

#include <stdio.h>
#include <stdlib.h>

void push(int data, int *tos, int size, int **stack)
{
    (*tos)++;
    printf("\ntos = %d\n", *tos);
    if (*tos > size)
    {
        puts("\nStack Overflow!!!\n");
        (*tos)--;
        return;
    }
    printf("\ndata = %d\n", data);
    *stack[*tos] = data;
    printf("\nstack[*tos] = %d\n", *stack[*tos]);
}

void pop(int *tos, int **stack)
{
    if ((*tos) == -1)
    {
        puts("\nStack Underflow!!!\n");
        return;
    }
    stack[*tos] = 0;
    (*tos)--;

    for (int i = 0; i < 5; i++)
        printf("%d\t", stack[i]);
    puts("\n");

}

int main()
{
    int size = 0, tos = -1;
    printf("\nEnter size of stack: ");
    scanf("%d", &size);
    int *stack = (int *) calloc(size, sizeof(int));

    push(9, &tos, size, &stack); push(1, &tos, size, &stack); //push(2, &tos, size, stack); push(3, &tos, size, stack); push(4, &tos, size, stack);

    for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");

    pop(&tos, &stack); //pop(&tos, &stack);

    /*for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");*/

    return 0;
}

1 Ответ

0 голосов
/ 25 июня 2018

Проблема в приоритет оператора .Подстрочный оператор [] имеет более высокий приоритет, чем оператор косвенного обращения *.Таким образом,

*stack[*tos] = data;

анализируется как:

*(stack[*tos]) = data;

Но stack - это указатель на массив, а не массив указателей, поэтому сначала вам нужно выполнить косвенный просмотр, прежде чеминдексирование.Так и должно быть:

(*stack)[*tos] = data;

И в pop() отсутствуют все разыменования stack.

Вот полностью рабочая версия:

#include <stdio.h>
#include <stdlib.h>

void push(int data, int *tos, int size, int **stack)
{
    (*tos)++;
    printf("\ntos = %d\n", *tos);
    if (*tos > size)
    {
        puts("\nStack Overflow!!!\n");
        (*tos)--;
        return;
    }
    printf("\ndata = %d\n", data);
    (*stack)[*tos] = data;
    printf("\nstack[*tos] = %d\n", (*stack)[*tos]);
}

void pop(int *tos, int **stack)
{
    if ((*tos) == -1)
    {
        puts("\nStack Underflow!!!\n");
        return;
    }
    (*stack)[*tos] = 0;
    (*tos)--;

    for (int i = 0; i <= (*tos); i++)
        printf("%d\t", (*stack)[i]);
    puts("\n");

}

int main()
{
    int size = 0, tos = -1;
    printf("\nEnter size of stack: ");
    scanf("%d", &size);
    int *stack = (int *) calloc(size, sizeof(int));

    push(9, &tos, size, &stack);
    push(1, &tos, size, &stack);
    push(2, &tos, size, &stack);
    push(3, &tos, size, &stack);
    push(4, &tos, size, &stack);

    for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");

    pop(&tos, &stack); //pop(&tos, &stack);

    for (int i = 0; i < size; i++)
        printf("%d\t", stack[i]);
    puts("\n");

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