реализация стекового массива в C - понимание передачи по ссылке - PullRequest
1 голос
/ 23 марта 2020

Так что это очень простая реализация стека (это массив с просто поп-функциями pu sh pop). Я пытаюсь понять, почему мой индекс не изменяется после помещения значений в массив. Первоначально у меня была переменная itop, расположенная в main как «int itop = 0», но поскольку значение itop оставалось равным 0, я подумал, что, возможно, это проблема передачи по ссылке, когда C берет копию значения и на самом деле не меняет само передаваемое значение. Так что я подумал, что хорошо, я бы сделал это stati c int наверху (я знаю, что это не лучшая практика из-за небезопасного поведения потока ...), но это все же не сработает.

Кто-нибудь указывает мне на понимание этой основы c концепции? Спасибо

#include <stdio.h>

void push(int a[], int, int);
int pop(int a[], int);

static int itop = 0;

int main(void){
        int stack[100];
        push(stack, itop, 1);
        push(stack, itop, 2);
        printf("index is %d\n", itop);
        int p1 = pop(stack, itop);
        printf("index is %d\n", itop);
        int p2 = pop(stack, itop);
        int p3 = pop(stack, itop);
        printf("popped elements: %d %d %d\n", p1, p2, p3);
        return 0;
}

void push(int a[], int ind, int elem){
        a[ind++] = elem;
}

int pop(int a[], int ind){
        if (ind < 0){
                return -1;
        }
        else {
                return a[ind--];
        }
}

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Вы не передаете переменную itop по ссылке. Вы передаете это по значению. Обе функции имеют дело с копией переменной itop, поэтому изменение копии не влияет на исходный объект.

Передача по ссылке в C означает передачу объекта косвенно через указатель.

Также в функциях pop есть ошибки в этих операторах

if (ind < 0){
    ^^^^^^^

и

return a[ind--];
         ^^^^^

Функции могут быть объявлены и определены следующим образом

void push(int a[], int *ind, int elem){
        a[( *ind )++] = elem;
}

int pop(int a[], int *ind){
        if (*ind == 0){
                return -1;
        }
        else {
                return a[--*ind];
        }
}

Pay Обратите внимание, что в общем случае функция pop имеет недостаток, который не позволяет хранить -1 в стеке, поскольку возвращаемое значение -1 из функции неоднозначно и может означать либо ошибку, либо фактический элемент стека.

Функция может быть определена следующим образом

int pop( int a[], int *ind, int *value )
{
    int error = *ind == 0 ? -1 : 0;

    if ( error == 0 )
    {
        *value = a[--*ind];
    }

    return error;
}
1 голос
/ 23 марта 2020

В C аргументы передаются по значению. Следовательно, это неправильно:

void push(int a[], int ind, int elem){
        a[ind++] = elem;   // ind is a local variable here 
                           // modifying it won't have any effect outside
                           // the push function
}
...
push(foo, bar, elem);    // bar won't be modified

Вы хотите это:

void push(int a[], int *ind, int elem){
        a[(*ind)++] = elem;
}
...
push(foo, &bar, elem);   // you pass a pointer to bar
                         // and bar will be modified

Тот же самый принцип должен применяться с pop.

Это самое основное c C знание.

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