c变量变为-17918变量

时间:2014-08-15 12:28:37

标签: c arrays variables gameboy

嗨,我正在制作一种编程语言,它将在c中的nintendo gameboy上运行 这就是为什么你会看到像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 个答案:

答案 0 :(得分:1)

你问是否有人发现问题,好吧 - 是的,这是一个问题:

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

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

如果k >= 2048,那么code[k] = ...将导致内存覆盖。

在内存覆盖之后,几乎任何事情都可能发生(未定义的行为)。

话虽如此,只有当k大于11时,CHAR_BIT的值才能大于2047。

#include <limits.h>添加到您的计划中,并确保CHAR_BIT不大于11。

答案 1 :(得分:0)

您必须将其转换为整数,因为这是您要打印的内容:

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

当你使用像printf这样的可变函数时,你必须确保传递正确的类型。检查编译器警告设置,新编译器可以轻松检测到这些问题。

答案 2 :(得分:0)

如果您要打印字符变量的字符值,则应按如下方式打印:

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

如果使用%d进行打印,则对于超过半个字符大小(0x80及以上)的字符,字符扩展为int的大小可能为负。

如果你坚持将它作为int转换打印变量,如下所示:

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