#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);