Звучит очень странно, но я заметил, что моя программа вылетает из-за того, что переменная буквально забыта (превращается в 0).
Это вывод gdb
...
709 while (progressione->avanti != NULL) {
(gdb) p nGiocatori
$30 = 4
(gdb) step
713 lista_stanze[i] = *progressione; // aggiungo la stanza alla
lista
(gdb) p nGiocatori
$31 = 4
(gdb) step
731 puts("");
(gdb) p nGiocatori
$32 = 0
(gdb)
как вы можете видеть после puts("") значение nGiocatori становится равным 0. Проблема не связана с путями (""), любой оператор вместо путов ("") вызывает ту же проблему.
Может ли кто-нибудь объяснить мне, почему происходит эта странная вещь?
(не знаю важно это или нет, но переменная nGiocatori глобальная и статическая unsigned short, ее значение берется через scanf.)
C не забывает глобальные переменные. Но они могут быть неожиданно изменены ошибками. Размещение кода (см. выше) поможет нам помочь вам.
Я бы не исключал ' lista_stanze[i] = * progresse;' писать за гранью, особенно если скомпилировано с оптимизацией.
Я заметил, что моя программа вылетает, потому что переменная буквально забыта
Это не "забыто", это перезаписано.
Похоже, у вас есть глобальное переполнение буфера в вашей программе. Вам могут помочь несколько общих подходов:
-Wall -Wextra -Werror
)gcc -fsanitize=address ...
)
Просто глядя на это, я понятия не имею, что может произойти. Но это кажется интересным. Можете ли вы предоставить минимальный и воспроизводимый пример, чтобы мы могли на него взглянуть?. Без него невозможно понять, что происходит