2012-12-05 52 views
1

我有幾個關於指針的問題。指針添加檢查

我有以下結構

struct buffer { 
    char *ptr; 
    char data[DATA_SIZE]; 
}; 

和我有以下代碼

printk("ptrs and what not: buf=%p, b-ptr=%p, b-data=%p, INIT_LOC=%lu\n", buf, buf->ptr, buf->data, INIT_LOC); 

if (buf) 
    buf->ptr = buf->data + INIT_LOC; 

printk("ptrs and what not: buf=%p, b-ptr=%p, b-data=%p, INIT_LOC=%lu\n", buf, buf->ptr, buf->data, INIT_LOC); 

的輸出是下面的:

ptrs and what not: buf=ffff880091ae2000, b-ptr=   (null), b-data=ffff880091ae2008, INIT_LOC=10 
ptrs and what not: buf=ffff880091ae2000, b-ptr=ffff880091ae2012, b-data=ffff880091ae2008, INIT_LOC=10 

問題

1)時一個dding一個數字,讓我們說2到一個帶地址的ptr可以說10001 是10003的值,或者10001 + 2 * sizeof(X),其中x是ptr的類型。 2)如果ptr = 10001是內存中的字符數組,那麼該數組中的第一個字符在位置10001處,是位置爲10002或10009處的第二個字符?或者它會是什麼?

3)要到buf-上面顯示的打印輸出>數據的地址是2008年,我不知道怎麼加10至它使其指向2012年

在此先感謝。

+1

2008 + A = 2012 in hex – jn1kk

+0

是的,謝謝,不知道我錯過了它:D – user1253073

+0

所有這些問題你可以找到答案。通過**自己嘗試** ... –

回答

2
  1. 10001 + 2 * sizeof(X)
  2. 10002
  3. 這是十六進制,0x2012-0x2008等於10(十進制)。
+0

因此對於問題2,地址是指向字節?所以字符A在10001和B將在10002,字符大小是C中的1個字節? – user1253073

+0

sizeof(char)== 1字節 – SomeWittyUsername

+0

'sizeof'實際上以字符大小的倍數返回大小,但您可以在理智的平臺上假設1個字符== 1字節 – Kos

0

1)兩者都是錯誤的。 X是指針的類型。

2)除非你的架構可以ADRESS東西比一個char小,應該是10002

3)0x2008 + 10 = 0x2012

2

1)將數字時,可以說2〜一個帶地址的ptr可以說10001是值10003,或10001 + 2 * sizeof(X),其中x是ptr的類型。

加法和減法向前或向後移動指針X 元素。這可以防止你有一個錯誤對齊的指針指向多字節對象的中間。 (除非你在指針類型之間進行無效轉換)。

2)如果PTR = 10001是存儲器字符數組,該數組中的第一個字符是在位置10001,是在位置10002或10009的第二字符?或者它會是什麼?

10002,因爲sizeof(char)是1。

3)去buf-上面所示的打印輸出>數據具有地址2008,我不知道如何加入10到它使其指向2012

通知十六進制符號。

+0

以及處於當前狀態的'data'會在不進行初始化的情況下給予垃圾。 – 2012-12-05 19:29:17

+0

sizeof(char)是1.好的。但是:這確保了用%p顯示的指針的表示是否處於相同的粒度?或者它可能更小? (比如,比特)? – Sebastian