1

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

该代码在摩托罗拉 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 is : dm 40a size is: 在这种情况下 userInput 的数字部分的长度 3

4

2 回答 2

2

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

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

并在其中输入40a,address 将指向以下字符数组:{ '4', '0', 'a', '\0', ...}终止 null 之后的内容无关紧要。完全像 in char *p = "0x5000";p 指向(不可修改,因为是文字)字符数组 { '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!
于 2018-02-01T15:39:47.250 回答
-1

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

于 2018-02-01T15:33:21.287 回答