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) 添加数字时,假设 2 到具有地址的 ptr 假设 10001 是值 10003,或 10001 + 2 * sizeof(X),其中 x 是 ptr 的类型。

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

3) 转到上面显示的打印输出 buf->data 的地址为 2008,我不确定如何将 10 添加到它使其指向 2012。

提前致谢。

4

3 回答 3

2
  1. 10001 + 2 * sizeof(X)
  2. 10002
  3. 它是十六进制的,0x2012-0x2008 等于十进制的 10。
于 2012-12-05T19:25:08.663 回答
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->data 的地址为 2008,我不确定如何将 10 添加到它使其指向 2012

注意十六进制表示法。

于 2012-12-05T19:26:12.047 回答
0

1) 两者都是错误的。X 是指针的类型。

2) 除非您的架构可以处理小于 char 的内容,否则它应该是 10002。

3) 0x2008 + 10 = 0x2012

于 2012-12-05T19:25:28.200 回答