qemu的奇怪C数组行为

时间:2018-03-07 00:59:55

标签: c operating-system kernel qemu

我正在为一个简单的系统操作制作一个内核,我在C中使用char数组时遇到了奇怪的行为。我使用qemu作为模拟器,OS编译为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' + 12),屏幕上打印的数字仍为0。 作为测试,我尝试打印数组中的第一个字符,如果我使用硬编码索引,它就可以工作:

*mem = msg[0]; //'H' is printed

奇怪的是,以下内容不起作用:

int i = 0;
*mem = msg[i]; //no output (or null character)

以下也有效:

*mem = 'H';

1 个答案:

答案 0 :(得分:1)

您可能需要将mem声明为volatile byte *

你编写的代码片段看起来像编译器,就像你写入它后没有任何事情发生。如果没有人使用* mem,那么编译器可以优化写入那里的指令,但不需要。

volatile是针对这种情况创建的,其他东西(视频显示系统)正在读取或编写编译器不知道的内存。

您可以在此处详细了解volatilehttp://en.cppreference.com/w/c/language/volatile