Получить значение, используя шестнадцатеричный адрес в c - PullRequest
0 голосов
/ 26 июня 2018

Это мой код:

#include <stdio.h>

void getTheValue();

int main() {
    char *address;
    char num[2] = "ab";

    address = (char *)num;
    printf("Address of num: %p\n", address);

    getTheValue();
    getchar();
    return 0;
}

void getTheValue() {
    unsigned char address[11];
    printf("Enter the address: ");
    scanf("%s", &address);
    printf("\naddress = %s", address);
    printf("\n");
    unsigned char *ptr
    ptr = (char *)(address);
    printf("The value at address = %c", *ptr);
}

===== ВЫХОД =====

Address of num: 0xffffcba6
Enter the address: 0xffffcba6

address = 0xffffcba6
The value at address 0xffffcba6 = 0
Process returned 0 (0x0)   execution time : 2.719 s
Press any key to continue.

Почему я получаю значение 0 ,Мне нужно значение num .

Пожалуйста, дайте мне несколько советов или пришлите несколько ссылок, где я могу узнать больше об этом.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Ваша программа не преобразует прочитанную строку в значение указателя.Вы просто печатаете первый символ, введенный пользователем.

Вы можете прочитать значения указателя из потока с помощью scanf("%p", &p);:

7.21.6.2 fscanffunction

...

p Соответствует определенному реализацией набору последовательностей, который должен совпадать с набором последовательностей, которые могут быть получены преобразованием% pфункции fprintf.Соответствующий аргумент должен быть указателем на указатель на void.Элемент ввода преобразуется в значение указателя в зависимости от реализации.Если входной элемент представляет собой значение, преобразованное ранее во время выполнения той же программы, полученный в результате указатель должен сравниться с этим значением;в противном случае поведение преобразования %p не определено.

Вот модифицированная версия вашей программы:

#include <stdio.h>

void getTheValue(void);

int main() {
    void *address;
    char num[] = "ab";

    address = num;
    printf("Address of num: %p\n", address);

    getTheValue();

    getchar();
    return 0;
}

void getTheValue(void) {
    void *p;
    printf("Enter the address: ");
    scanf("%p", &p);
    printf("address = %p\n", p);
    unsigned char *ptr;
    ptr = p;
    printf("The value at address = `%c`, decimal %d, hex 0x%02x\n", *ptr, *ptr, *ptr);
}

Трассировка:

~/dev/stackoverflow > ./peek
Address of num: 0x7fff5101e94c
Enter the address: 0x7fff5101e94d
address = 0x7fff5101e94d
The value at address = `b`, decimal 98, hex 0x62
0 голосов
/ 26 июня 2018

Я получил его на работу с помощью strtol.Ваше «значение» было просто первым символом строки «0x ....» из адреса - вместо того, чтобы сначала преобразовать всю строку в целое число - и использовать это целое число в качестве адреса.

Здесьэто код:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void getTheValue();

int main() {
  char* address;
  char num[3] = "ab";

  address = (char *)num;
  printf("Address of num: %p\n", address);

  getTheValue();
  getchar();
  return 0;
}

void getTheValue() {
  char address[11];
  printf("Enter the address: ");
  scanf("%s", &address);


  char *ptr = (char *)strtol(address, 0, 16);
  printf("The value at address = %c", *ptr);
 }

Тогда ptr = "ab" --- Обратите внимание, что я не набираю 0x в моем входе однако.

enter image description here

...