Массив показывает свой указатель вместо своего значения

StackOverflow https://stackoverflow.com/questions/20353801

  •  25-08-2022
  •  | 
  •  

Вопрос

Я застрял в некоторых проблемах, к сожалению, я все еще изучаю детали этого языка.

У меня есть следующий код

#define SIZE 5
typedef struct 
{
    int start;
    int end;
    int nElements;
    int vetor[SIZE];
} TSTACK;

и я стараюсь вставить значения в его массив, используя следующую функцию:

void Push(TSTACK *s, int elementInsert)
{
    if(IsFull(s))
    {
        printf("%s\n", "# ERROR: full.");
    }
    else
    {
        s->end++;
        if(s->end == SIZE)
        {
            s->end = 0;
        }

        s->vetor[s->end] = elementInsert;
        s->nElements++;
    }
}

И я использую следующую функцию, чтобы показать элементы:

void Display(TSTACK *s)
{
    int i;
    if (isEmpty(s))
    {
        printf("%s\n", "# ERROR: empty");
    }
    else
    {
        for (i = 0; i < s->nElements; i++) 
        {
            printf ("value: %d\n", s->vetor[i]);
        }
    }
}

Мой вопрос заключается в том, что я не получаю такого же результата, когда добавляю различное количество элементов, когда я вставляю 5 элементов, функция дисплея правильно отображает все элементы, но когда я вставляю менее 5, первый элемент, кажется, его указатель:

Следующие основные результаты в 4201166, 3, 5, 7

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);

    Display(&test);
}

Следующие основные результаты в 5, 3, 5, 7, 3

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);
    Push(&test, 5);

    Display(&test);
}

Может кто -нибудь показать мне, где я ошибаюсь?

Это было полезно?

Решение

Когда вы «вставляете» элемент, вы делаете это по

s->vetor[s->end]

Но прежде чем сделать это увеличивать s->end, поэтому первый элемент будет в s->vetor[1]. Анкет Поскольку первый элемент (s->vetor[0]) не инициализирован, у вас там будет случайное значение. Это причина, по которой у вас сначала есть странная ценность во вставке с четырьмя значениями.

Когда вы вставляете пятое значение, у вас есть чек на s->end == SIZE где вы установили s->end Чтобы ноль, поэтому последнее значение в этом случае окажется в первую очередь в массиве.

Решение, которое решит обе вышеперечисленные проблемы, состоит в том, чтобы увеличить s->end после Вы присвоили значение массиву.

Другие советы

Когда вы печатаете стек:

for (i = 0; i < s->nElements; i++) 
{
    printf ("value: %d\n", s->vetor[i]);
}

Вы начинаете с индекса 0, но ваша реализация стека начинается с индекса 1, поэтому, когда у вас меньше 5 элементов, первый элемент не инициализируется. Возможно, вы сможете исправить это, изменив начальное значение на 0.

Первая проблема: локальные переменные не инициализированы, они содержат мусор, если вы их не инициализируете их.

Вторая проблема: вы начинаете назначать в массиве индекс 1 вместо 0. Только когда вы вставляете пять элементов, это будет работать, потому что вы проверяете, если end == SIZE и если так настроен end = 0, создание пяти вставки установить первый элемент vetor[0].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top