2015-06-17 202 views
0

我的main()應該得到一個地址作爲輸入,它需要存儲在void*地址中。將void *類型傳遞給main()函數

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

我想要這個HandleStr作爲類型void *。我怎樣才能做到這一點?

現在,我想在運行exec爲./testapp "0xaf6e9800"

+7

您知道在現代操作系統上進程具有虛擬地址空間,更重要的是每個進程的虛擬地址空間與其他進程是分開的。這意味着一個進程中的有效地址很可能在另一個進程中無效,即使它有效,也不能保證它指向類似的數據。 –

+3

'argv []'中的參數總是字符串(char *)。所以你輸入的地址必須先轉換爲數字,然後作爲指針處理。 –

+0

如果你想在兩個進程之間共享內存,那麼稱爲[*共享內存*](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); 
     } 
    } 
} 

但要注意:應該知道什麼是價值,它應該如何在你的程序中使用。正如Joachim Pileborg所說,一個過程不能訪問任何記憶值。

相關問題