指针添加检查

时间:2012-12-05 19:21:00

标签: c pointers

我有一些关于指针的问题。

我有以下结构

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)当添加一个数字时,让我们说2到一个带有地址的ptr可以说是10001 是值10003,或10001 + 2 * sizeof(X),其中x是ptr的类型。

2)如果ptr = 10001是内存中的字符数组,则该数组中的第一个字符位于10001位置,是位置10002或10009处的第二个字符?或者会是什么?

3)进入上面显示的buf->数据的打印输出有地址2008,我不确定如何添加10使它指向2012年。

提前致谢。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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

注意十六进制表示法。

答案 2 :(得分:0)

1)两者都错了。 X是指针对象的类型。

2)除非你的架构可以使用小于char的东西,否则它应该是10002。

3)0x2008 + 10 = 0x2012