我正在为一个简单的系统操作系统制作一个内核,但我陷入了一个奇怪的行为 char
C 中的数组。我使用 qemu 作为模拟器,操作系统编译为 x86_64。
给出以下代码:
char msg[] = "Hello World!";
int i = 0;
while (msg[i] != 0)
i++;
byte *mem = (byte*)VIDEO_ADDRESS; //VGA text mode
*mem = '0' + i; //print '<'
屏幕上打印的数字是 0,尽管它应该打印 '<' ('0' + 12)
。
作为测试,我尝试打印数组中的第一个字符,如果我使用硬编码索引,它会起作用:
*mem = msg[0]; //'H' is printed
奇怪的是,以下内容不起作用:
int i = 0;
*mem = msg[i]; //no output (or null character)
以下内容也适用:
*mem = 'H';
最佳答案
您可能需要将 mem 声明为 volatile 字节 *
。
您编写的代码片段在编译器看来就像您写入 *mem 后没有任何反应。如果没有人使用 *mem,那么编译器可以优化写入其中的指令,但这不是必需的。
volatile
是为这种情况而创建的,其中其他东西(视频显示系统)正在读取或写入编译器不知道的内存。
您可以在此处阅读有关 volatile
的更多信息:http://en.cppreference.com/w/c/language/volatile
关于c - qemu 的奇怪 C 数组行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142496/