嗨,我正在制作一种编程语言,它将在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 任何人都可以看到任何会导致它表现出来的问题吗?
答案 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]);