Я отлаживаю код C, где у меня есть указатель внутри указателя на структуру с именем board
. Есть функция, где я печатаю плату:
static void board_print(board *b){
int i,j;
char data;
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
data = b->data[i * size + j];
if(data){
printf("X ");
}else{
printf("O ");
}
}
printf("\n");
}
}
Вот странная часть. Когда я сначала нажимаю точку останова в начале первого цикла for, все в порядке, мои данные верны, все указатели работают и т. д., как показано ниже:
Затем я вхожу в цикл в первый раз, когда i и j равны нулю, а b->data[0]
должно быть абсолютно допустимым, как это было два шага назад. Внезапно, как только я наступаю на строку data = b->data[i * size + j];
, указатель данных превращается в нулевой указатель. Когда я выполняю строку, я (очевидно) получаю ошибку неправильного доступа, как показано ниже:
Что может быть причиной? Я использовал C раньше, и я довольно хорошо разобрался с ним, но я никогда не видел, чтобы значение указателя внезапно менялось на нулевое, когда я выполнял простую однопоточную программу C. Я использую Apple LLVM Compiler 4.1 для компиляции и lldb для отладки, которые используются по умолчанию в XCode 4.5.
Обновление: такое же поведение наблюдалось при компиляции с помощью gcc и отладке с помощью gdb. Почти стопроцентная ошибка на моей стороне, но я понятия не имею, что не так с кодом.
Обновление №2: я заметил кое-что еще более странное в gcc/gdb. Непосредственно перед выполнением строки data = b->data[i * size + j];
я без проблем могу получить доступ ко всему из отладчика. Сразу после выполнения этой строки я не могу полностью получить доступ к b->data
, включая значения, к которым я обращался непосредственно перед шагом:
После строки $4 = ...
, которая успешно выполнилась в отладчике, я перешагнул через эту строку. Тогда у меня есть различные ошибки адресации, как показано выше. Я действительно понятия не имею, что происходит...
Обновление №3: я заметил кое-что очень странное. Здесь сначала посмотрите на исправление, которое я реализовал. Этот начал работать без проблем, когда я полностью избавился от переменной с именем data
:
Теперь внимательно посмотрите на снимок экрана, который я загрузил с обновлением № 2: сразу после того, как я присвоил значение локальной переменной с именем data
, адрес b->data
также изменился. Это похоже на побочный эффект задания. Но я понятия не имею, в чем причина этого.
var = i * size + j;
и проверьте, чтоb->data[var]
действительно является допустимым указателем, аvar
не выходит за пределы допустимого диапазона, и действительно, что вы рассчитали как правильный индекс? - person P.P   schedule 29.12.2012