2017-02-02 3 views
-1

Я думал, что у меня было несколько хорошее понимание указателей, но у меня проблемы с моим кодом. Он продолжает рушиться.Проблема с указателями C

Всякий раз, когда я пытаюсь получить доступ к стеку и передаю его содержимое на b1, моя программа сработает.

int base(int l, int base, int *stack[2000]) 
{ 
    int b1; //find base L levels down 
    b1 = base; 

    while (l > 0) 
    { 
     b1 = *stack[b1 + 1]; 
     l--; 
    } 

    return b1; 
} 

EDIT: программа представляет собой назначение виртуальной машины, использующее архитектуру стека. То, что я передаю, это текущая запись активации базы и лексикографический уровень, к которому я пытаюсь получить доступ. Проще говоря, они целые. Я получаю доступ к своему стеку через указатель и возвращаю базу уровня активации, на которой я должен быть, но я не совсем уверен, правильно ли использую указатели.

+1

Может быть полезно включить описание того, что должен делать код, и, может быть, какие параметры вы передадите ему, когда он сработает. – jayjay

+0

@jayjay обновлено – RiGid

+0

Вы получаете сообщение об ошибке? –

ответ

0

Довольно уверен, что вы разыскиваете указатель в дополнительное время и добавляете дополнительную звезду к первоначальной декларации. Если ваша функция принимает массив целых чисел, так как ваша правка предлагает объявить его как

int base(int l, int base, int stack[2000]) 

int *stack[2000] представляет собой массив указателей на целые числа, а не массив целых чисел. Затем вам нужно изменить b1 = *stack[b1 + 1]; только получить целое число из массива вместо разыменования указателя на целое число:

b1 = stack[b1 + 1]; 

Наконец, вы можете объявить и присвоить b1 в той же строке:

int b1 = base; 

Действительно, вам не нужно b1. Поскольку вы можете уменьшить l, исходя из того, что C является передачей по значению, вы можете переназначить base таким же образом без проблем.