2013-01-01 96 views
3

我無法理解從CCS C編譯器代碼。該代碼是:C指針嵌套

addr[0] = *(((char*)&block_number)+2); 

我猜「&block_number」被命名爲「段號」變量的地址。之後,我迷路了。

回答

0

你是正確的。 & block_number是該變量的地址,並將其轉換爲char,並將值2添加到該值。例如,如果&段號是0×0000,則地址[0]執行行之後將包含0×0002,如果在平臺上的的sizeof(char)的爲2,或任何尺寸。

+0

或者它可能是0x0004如果的sizeof(char)的是2 –

+1

@AdrianGrigo:這是不可能的,根據定義。 –

+0

自從我第一次回答這個問題以來,這個問題已經發生了變化。現在它將block_number [2]的值放在addr [0]處,而它最初是放置地址(它沒有意義,但那是代碼)。 –

1

我們分了這件事:

*(ptr+2) 

等同於:

ptr[2] 

這裏,ptr是指着block_number地址的char*

所以說block_number是這樣一個結構的實例:

struct { 
    char a; 
    char b; 
    char c; 
    char d; 
} block_number 

然後addr[0]將包含c值(假設值都擠滿了他們之間沒有空格)。這是因爲指針block_number被轉換爲char*,然後索引等的陣列。

因此,基本上,這個讀取block_number第三個字節。

0
  1. &block_number是對象block_number的地址。

  2. (char*)&block_number對待作爲第一元件的以字節爲單位的陣列的地址,解決。我們稱這個指針爲p,它是一個指向char的指針。

  3. *(((char*)&block_number)+2)因此是*(p + 2),它與p[2]相同,即它表示陣列的第三個元素。

換句話說,你正在獲得對象block_number的二進制表示的第三個字節(並存儲它addr[0])。

1

當人們不知道block_number是什麼時,有點難說。我們說,這是與價值0xdeadbeef一個整數

unsigned int block_number = 0xdeadbeef; 

在小端架構(即86):

*(char *)&block_number is 0xef, 
*(((char *)&block_number) + 1) is 0xbe and 
*(((char *)&block_number) + 2) is 0xad. 

雖然如果段號是一個char然後*(((char *)&block_number) + 2)可以指向一個相鄰的可變,讓說段號是在堆棧上宣稱:

char a = 0xab, b = 0xbc, block_size = 0xcd, c = 0xde, d = 0xef; 

然後((char *)&block_size + 2可以指向即a*(((char *)&block_size + 2)將返回0xab。因爲棧是最常見的從最高地址責令低位地址:

heap            stack 
[... ->  <- d | c | block_size | b | a ] 
[... ->  <- 0xef | 0xde | 0xcd  | 0xbc | 0xab ] 

但是,這是從來沒有一定的C沒有把任何約束編譯器在哪裏可以找到a和位置可能是不確定的。

對於sizeof(char)它是總是1char是一個字符,這就是爲什麼如果你想分配內存你不需要指定length * sizeof(char)到malloc。你只做:

int length = 20; 
void *mem = malloc(length);