Переменная c превращается в -17918 при увеличении

Привет, я делаю язык программирования, который будет работать на Nintendo GameBoy в C, поэтому вы увидите некоторые функции, такие как waitpad(); но этот вопрос не относится к библиотекам gameboy по какой-то причине, когда я пытаюсь увеличить некоторую переменную в моем файле main.c:

#include <stdio.h>
#include <gb/gb.h>
#include "convert.h"
#include "display.h"
#include "input.h"
#include "functions.h"
#include "interpreter.h"

unsigned char cnt[5] = {1,2,3,4,5};//cnt is short for counters
unsigned char k = 0;
unsigned char running = 1;

unsigned char memory[2048];
unsigned char code[2048];

int main()
{
    Clear_mem();
    Clear_code();

    while(running == 1) {
        display(cnt[0],cnt[1],cnt[2],cnt[3],cnt[4]);
        printf("cnt[0] = %d\n", cnt[0]);
        cnt[0]++;//turns into -17918
        printf("Press Start To Enter   Next Character\n");
        waitpad(J_START);
        code[k] = input();
        interpret(code[k]);
        k++;
    }

    return 0;
}

cnt [0] превращается в -17918. Может ли кто-нибудь увидеть какую-либо проблему, которая заставит его так себя вести?

3 ответа

Вы спрашиваете, видит ли кто-нибудь проблему, хорошо - да, вот проблема:

unsigned char k = 0;
unsigned char running = 1;
unsigned char code[2048];

while(running == 1) {
    code[k] = input();
    k++;
}

Если k >= 2048, затем code[k] = ... вызовет переопределение памяти.

После переопределения памяти может произойти почти все (неопределенное поведение).

Сказав это, ценность k может быть больше, чем 2047, только если CHAR_BIT больше 11

добавлять #include <limits.h> к вашей программе и убедитесь, что CHAR_BIT не больше 11.

Вы должны преобразовать его в целое число, потому что это то, что вы пытаетесь напечатать:

printf("cnt[0] = %d\n", (int) cnt[0]);

Когда вы используете переменную функцию, такую ​​как printf, вы должны убедиться, что вы передаете правильный тип. Проверьте настройки предупреждений вашего компилятора, новые компиляторы могут легко обнаружить подобные проблемы.

Если вы хотите напечатать символьное значение вашей символьной переменной, вы должны напечатать его так:

printf("cnt[0] = %c\n", cnt[0]);

Если вы печатаете это с помощью %d расширение символа до размера int может быть отрицательным для символов размером более половины символа (0x80 и выше).

Если вы настаиваете на печати его как int, приведите переменную следующим образом:

printf("cnt[0] = %d\n", (int)cnt[0]);
Другие вопросы по тегам