Motorola 68HC11平台C语言通过用户输入十六进制值读取内存地址问题
解决Motorola 68HC11上用户输入十六进制地址读取内存的问题
嘿,我明白你的困扰了——你现在的问题核心是把用户输入的十六进制字符串和实际的内存地址搞混了,咱们一步步来拆解和解决:
先搞清楚你之前尝试失败的原因
直接用用户输入的字符串赋值给指针:
你写的char *p = arr;,这里的arr是用户输入的字符串(比如"40a"),此时p指向的是这个字符串在内存中的存储位置,而不是0x40A这个地址的内存单元,完全是两个不同的东西,自然读不到正确内容。用字符串字面量赋值指针:
char *p = "0x5000";同理,p指向的是字符串"0x5000"本身的首地址,不是0x5000这个目标内存地址,所以肯定出错。
而你最开始的硬编码写法char *p = (char*)0x5000;能成功,是因为0x5000是一个整数常量,直接被转换成了对应内存地址的指针。
正确的解决思路
我们需要先把用户输入的十六进制字符串转换成对应的整数(也就是内存地址值),再把这个整数强制转换成char*指针,这样才能访问到目标地址的内容。
考虑到68HC11是16位处理器,我们用16位无符号整数来存储地址值就足够了。
具体实现方案
方案1:用标准库函数解析(如果你的开发环境支持标准库)
利用strtoul函数把十六进制字符串转成无符号长整型,再转成指针:
#include <stdlib.h> #include <stdio.h> void displayMemory(const char *hexInput) { // 把十六进制字符串转成整数,base=16支持带0x前缀或纯数字的十六进制 unsigned long addrValue = strtoul(hexInput, NULL, 16); // 强制转换成char*指针(68HC11是16位,addrValue会自动截断为16位地址) char *targetAddr = (char *)addrValue; // 打印地址内容(注意:要确保目标地址开始的内存有'\0'结尾,否则printf会越界) printf("Address Ascii: %s\n", targetAddr); // 更安全的方式:打印固定长度的内容,避免越界 printf("First 8 characters: "); for (int i = 0; i < 8; i++) { printf("%c ", *(targetAddr + i)); } printf("\n"); } int main() { char userInput[10]; printf("Enter hex address (e.g., 0x5000 or 5000): "); scanf("%s", userInput); displayMemory(userInput); return 0; }
方案2:手动解析十六进制字符串(如果环境没有标准库支持)
如果你的68HC11开发环境不提供strtoul,可以自己写一个简单的十六进制转整数的函数:
#include <stdio.h> #include <ctype.h> // 把十六进制字符串转成16位无符号整数 unsigned int hexToAddr(const char *hexStr) { unsigned int result = 0; // 跳过开头的0x前缀 if (hexStr[0] == '0' && (hexStr[1] == 'x' || hexStr[1] == 'X')) { hexStr += 2; } // 逐个字符解析 while (*hexStr != '\0') { char c = toupper(*hexStr); if (c >= '0' && c <= '9') { result = (result << 4) + (c - '0'); } else if (c >= 'A' && c <= 'F') { result = (result << 4) + (10 + c - 'A'); } else { // 遇到非法字符,直接终止解析(可以根据需求添加错误处理) break; } hexStr++; } return result; } void displayMemory(const char *hexInput) { unsigned int addrValue = hexToAddr(hexInput); char *targetAddr = (char *)addrValue; printf("Address Ascii: %s\n", targetAddr); } int main() { char userInput[10]; printf("Enter hex address: "); scanf("%s", userInput); displayMemory(userInput); return 0; }
额外注意事项
- 内存有效性:要确保用户输入的地址在68HC11的有效内存范围内,否则会触发非法地址访问错误。
- 字符串终止符:如果目标地址开始的内存没有
'\0',用printf("%s")会一直读取到内存末尾,可能导致程序崩溃,所以建议用固定长度的循环打印内容更安全。
内容的提问来源于stack exchange,提问作者Aaron Nebbs
相关产品推荐
相关产品推荐

