c - 字符显然没有在 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"
, 的 ASCII 值替换它A
,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
文字。
推荐阅读
- java - 通过 LiveData 观察者将项目添加到特定索引时出现 IndexOutOfBoundsException
- python - 如何解决pycharm上的错误“dotenv安装错误”
- couchdb - Hyperledger Fabric 私有数据收集分发大文件
- ios - 为什么 UITextView 中的链接有时会显示为黑色并带有下划线?
- javascript - DataTables 列、columnDefs 和 rowCallback HTML5 初始化
- python-3.x - python中达到的最大递归深度
- c - 在 raspberrypi 中生成:缺少分隔符错误
- keras - 如何修复 Conv1D Autoencoder '期望有 3 个维度......'
- python - 构建二维金字塔数组 - Python / NumPy
- docker - Zeppelin 与 Kubernetes。在非本地模式的解释器设置中未指定 SPARK_HOME