我有一些关于指针的问题。
我有以下结构
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年。
提前致谢。
答案 0 :(得分:2)
10001 + 2 * sizeof(X)
10002
答案 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