2014-01-07 51 views
1

你好,我在Linux下編程(在C)。長的大小等於一個字的大小

當我使用ptrace()讀取數據時,它返回一個單詞。 在所有的例子中,我看到人們用很長的時間來閱讀輸入。 Long是否總是具有相同大小的單詞?我知道一個字是處理器正在處理數據的自然大小(寄存器大小)。但是這是否也適用於不同的架構等?

OValue_t outputValue; 
//.su_word is a long 
outputValue.su_word = ptrace(PTRACE_PEEKDATA,Process.ProcId,address,0); 
printf("word : %ld\n", outputValue.su_word); 
printf("int8 : %i\n", outputValue.su_int8); 

編輯:感謝克日什托夫·科辛斯基/放鬆和喬納森·萊弗勒here答案我的理解是ptrace的返回長和長是一個字夠大。

http://docs.oracle.com/cd/E19620-01/805-3024/lp64-1/index.html

回答

3

Linux API定義ptrace始終返回long

long ptrace(enum __ptrace_request request, pid_t pid, 
      void *addr, void *data); 

在Linux中,的long大小等於機器字大小(在32位機器32位,對64位機器64位,依此類推)。據我所知,在所有具有Linux端口的主要架構上都是如此。

請注意,在Windows上這不是真的,其中long即使在x64上也是32位 - 但由於ptrace是Linux特定的調用,因此您不必擔心它。

4

例子使用long因爲這是怎麼function is documented工作,原型爲:

long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); 

有在手冊中的說法,甚至一張紙條:

的大小一個「字」由操作系統變體決定(例如,對於32位Linux,它是32位)。

我認爲它只是以及已宣告迴歸int,因爲int應該是一個平臺的「自然」整數大小,我認爲是「字大小」的典型案例,平臺。

功能確實不是假設long比「一個單詞」更精確,據我所知,從手冊頁。它使用-1的返回值來表示錯誤,但是由於它當然也可以是有效值,因此還需要您檢查errno

+0

謝謝,但在手冊中寫着'在地址處讀一個字',那麼他們如何能夠假設一個長的字足夠大以便在不同的平臺上存儲一個字? – Jona

+0

http://stackoverflow.com/questions/589575/size-of-int-long-etc喬納森的回答給了我答案 – Jona

+1

「int」不等於x86-64和大多數其他64位系統的字大小。 –

-2

的唯一規則是,必須至少一個(INT)的大小。除此之外,它取決於機器架構和編譯器編寫者。你可以合法地擁有char = short = int = long = long long。

+1

'int'沒有被定義爲等於字的大小,只有建議它應該是最快的可用整數類型。實際上,即使在64位機器上,「int」也是32位,這意味着它小於字的大小。 –