问题描述
我正在Kali机器上开发基本的C内核,并在QEMU中对其进行测试。这是内核代码:
void kernel_main();
void print();
void print() {
char* vidMem = (char*)0xb8000;
*vidMem = "A";
vidMem++;
*vidMem = 0x0f;
}
void entry() {
kernel_main();
while(1);
}
void kernel_main() {
print();
}
这将打印Z
而不是A
,但是如果我用"A"
,A
的ASCII值替换0x41
,它将按预期方式工作并打印A
到屏幕。此外,我还会收到此错误:
kernel.c:6:10: warning: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
6 | *vidMem = "A";
| ^
如果我理解正确,则编译器认为我正在尝试将vidMem
本身的值更改为其他数据类型的其他值;但是,我取消引用vidMem
变量,只更改了vidMem
指向的内存字节,因此我对为什么出现此错误感到困惑。将"A"
替换为0x41
时没有收到错误,所以我所看到的只是编译器对"A"
和0x41
的处理不同。为什么会这样?如何在不需要提供ASCII值的情况下打印所需的字符?
解决方法
*vidMem = "A";
这等效于
vidMem[0] = "A";
“ A”是一个字符串,而不是一个字符,因此您正在将字符串"A"
的地址(的最低字节)分配到该内存位置。
您想这样做:
vidMem[0] = 'A';
请注意单引号,这使其成为char
文字。