Почему эта переменная изменится после оператора return? - PullRequest
5 голосов
/ 29 мая 2011

У меня есть функция с подписью:

int exe(int stack[][STACKSIZE], int sp[], int reg[][REGISTERSIZE], int next_instruct[],
        int next_inst[], int cur_proc, int *terminate);

Она имеет две последние строки:

printf("TWO cur_proc: %d\n",cur_proc);
return NORMAL;

И называется так:

printf("ONE cur_proc: %d\n",cur_proc);
msg = exe(stack,sp,reg, next_instruct, next_instruct, cur_proc, &terminate);
printf("THREE cur_proc: %d\n",cur_proc);

И я передаю cur_proc, который рассматривается как переменная «только для чтения» (не то, чтобы она передавалась по значению) внутри exe().Делай мои вещи внутри exe().

И мой вывод:

ONE cur_proc: 1
TWO cur_proc: 1
THREE cur_proc: -1

Это меня очень смущает, так как я не вижу никакой причины, по которой это можно перезаписать отрицательной.

Какова возможная причина этого странного поведения?

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

Вы, вероятно, пишете за пределами одного из массивов.

Внутри функции вы смотрите на копию переменной в вызывающей функции, а не на исходную переменную.Поэтому printf() внутри функции не сообщает вам, когда значение было вызвано в вызывающей функции.

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

Если вы хотите отслеживать, когда изменение в cur_proc вызывается в вызывающей функциипроисходит внутри вызываемой функции, передайте указатель на cur_proc в функцию - а также или вместо значения - и выведите значение через указатель.

3 голосов
/ 29 мая 2011

Если код в вашей функции exe записывает данные в недопустимое место в одном из переданных массивов, стек может быть поврежден, что может привести к изменению значения локальных переменных выше по стеку (среди прочих вещи).

Учитывая характер переменной, доступной только для чтения, с точки зрения функций, либо это происходит, либо другой поток изменяет значение cur_proc - первый кажется более вероятным, если вы не возитесь с многопоточностью.

Большинство отладчиков позволяют устанавливать точку останова на «изменение значения по определенному адресу в памяти». Если вы получите адрес cur_proc и прервитесь, когда значение по этому адресу изменится, вы должны найти своего виновника.

...