微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符显然没有在C内核中转换为ASCII值

如何解决字符显然没有在C内核中转换为ASCII值

我正在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文字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。