使用用户输入的十六进制值读取c中的存储器地址

时间:2018-02-01 15:12:25

标签: c memory memory-address 68hc11

目的是允许用户输入内存地址(十六进制)并打印出地址内容。

代码在Motorola 68HC11上运行。

到目前为止,我能够使用硬编码值读取内存地址:

void displayMemory(){
    char *p = (char*)0x5000;
    printf("Address Ascii: %s\n",p);
}

但是我尝试了多种使用用户输入数据的方法,例如:

void displayMemory(char *arr){
    char *p = arr;
    printf("Address Ascii: %s\n",p);
}

^^其中* arr是输入的十六进制值。如:40a

我还尝试将十六进制值硬编码为char数组,如:

void displayMemory(){
    char *p = "0x5000";
    printf("Address Ascii: %s\n",p);
}

这也没用,给了我一个不同的记忆地址。

任何想法都会非常感激,我可能非常愚蠢!

更新: 如何调用函数

char *arr;
arr = malloc(size * sizeof(char));
if(arr){
    strncat(arr, &userInput[3], size);
    displayMemory(arr);
}else{
    return 0;
}

userInput是:dm 40a size是:在这种情况下userInput的数字部分的长度3

2 个答案:

答案 0 :(得分:1)

您即将自己找到解决方案。如果您将地址输入char数组,例如:

char address[16];
printf("Enter address in hexa: ");
scanf("%15", address);

并在其中键入40a,地址将指向以下字符数组:{ '4', '0', 'a', '\0', ...}终止空值后的内容无关紧要。与char *p = "0x5000"; p中的明显一样,指向(不可修改的因为litteral)字符数组{'0','x','5','0','0','0','\ 0'} `。假设ASCII,它在第一种情况下给出{0x34,0x30,0x41,0,......},在第二种情况下给出{0x30,0x78,0x35,0x30,0x30,0x30,0}。在任何一种情况下,它都存在于与该值无关的任意地址。

当地址 预期值时,有效的方法是什么。因此,您需要将地址读取为整数值,然后将其转换为char指针

int address;
scanf("%i", &address);
char *p = (char *) address;    // NOT &address!

答案 1 :(得分:-1)

首先,据我所知,这是不可能的。 我也问过我的教授,他告诉我,我们不能这样做,实际上你也不知道存储在任何特定地址的数据类型。 很抱歉,这样就无法访问数据了。