2015-06-17 3 views
0

My main() должен получить адрес в качестве входного файла, который необходимо сохранить в адресе void*.Pass void * type to main() function

int main(int argc, char *argv[]) 
{ 
    if (argc > 1) { 
     HandleStr = argv[1]; 
     printf("\n Handle passed : %s\n",HandleStr); 
    } 
} 

Я хочу эту ручкуStr как тип void *. Как я могу это сделать?

Теперь я хочу, чтобы запустить ехес в ./testapp "0xaf6e9800"

+7

Вы знаете, что на современных операционных системах процессы имеют виртуальные адресные пространства, и, что более важно, каждое виртуальное адресное пространство процесса отделено от других процессов. Это означает, что действительный адрес в одном процессе, скорее всего, не будет действительным в другом процессе, и даже если он действителен, нет гарантии, что он указывает на аналогичные данные. –

+3

Аргументы в 'argv []' всегда являются строками (char *). Таким образом, добавленные вами addres должны быть сначала преобразованы в число и после этого обработаны как указатель. –

+0

Если вы хотите разделить память между двумя процессами, то это называется [* shared memory *] (https://en.wikipedia.org/wiki/Shared_memory_%28interprocess_communication%29), и даже при использовании того, что фактические адреса будут скорее всего, будут отличаться в двух процессах. –

ответ

4

Я подозреваю, что вы хотите что-то вроде

HandleStr = (void *)strtol(argv[1], NULL, 16); 
+0

['strtoul'] (http://en.cppreference.com/w/c/string/byte/strtoul), вероятно, будет лучше. Не то чтобы это важно, если OP не работает в системе с единым унифицированным адресным пространством (некоторые операционные системы для небольших встроенных систем все еще это делают). –

2

Если у вас есть C99 компилятор, вам необходимо:

  • расшифровывает argv[1] как шестнадцатеричное число в intptr_t
  • присвойте это значение вашему void *

Что-то вроде:

int main(int argc, char *argv[]) 
{ 
    if (argc > 1) { 
     long lh = strtol(argv[1], NULL, 16); 
     if (lh != 0) { 
      intptr_t ph = lh; 
      void *handle = ph; 
      printf("\n Handle passed : %p\n",handle); 
     } 
    } 
} 

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