2012-12-05 49 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