присвоить адрес памяти, заданный argv, указателю в c

#c #pointers #memory #argv

#c #указатели #память #argv

Вопрос:

У меня есть функция на C, которая получает указатель и печатает его код дизассемблирования.

 void print_dis(void *addr) {
    print_dis(addr);
}
  

все работает просто отлично, но теперь я хотел бы передать этот адрес памяти из командной строки как argv.

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

my_prog 0x1234567890abcd

и этот print_dis получит этот адрес как addr

Комментарии:

1. Вы ищете функцию, подобную strtoull() ? Возможно, что-то вроде void *addr = (void*) strtoull(argv[1] 2, 0, 16); ?

2. strtoull вернет мне новое значение long long, которое имеет то же значение, что и строка, верно? как я могу использовать это в качестве адреса?

3. Вы согласны с тем, чтобы просто перенаправить стандартный вывод «program1» в стандартный идентификатор вашей второй программы??

4. не совсем, я хотел бы использовать тот же метод и с модулем ядра

5. Вы можете перенаправить выходные данные модуля ядра, нет? >

Ответ №1:

Вы можете преобразовать строку из argv[1] в unsigned long и присвоить ее универсальному указателю, используя оператор приведения (void*), как показано в примере ниже.Будьте осторожны, это опасно!

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

int main(int argc, char* argv[])
{
   void* ptr = (void*) strtoul(argv[1] 2,0,16);

   printf("%lX", (unsigned long) ptr);

}.
/*
Output:
/a.out 0x123456789abcdef
Result ptr:123456789ABCDEF
*/
  

Ответ №2:

Простите меня, если я неправильно понял ваш вопрос, но можете ли вы взять указатель и использовать printf("%p", ptr); . Или, если вы имеете в виду заставить вашу программу записывать данные в stdin другой программы, вы можете использовать, например, конвейер Linux.

Вы также можете просто получить значение адреса char * из argv с помощью reinterpret_cast<WhateverType>(source);