我不知道';我不懂C指针
我真的不明白为什么我得到了一个与我期望的不同的地址 我尝试用我不知道';我不懂C指针,c,pointers,pointer-arithmetic,C,Pointers,Pointer Arithmetic,我真的不明白为什么我得到了一个与我期望的不同的地址 我尝试用-m32标志选项构建这个小C代码 #include <stdio.h> #include <stdlib.h> char *Buffer[10]; int main (void){ printf("%p\n", Buffer); char *Buffer2 = Buffer + 6; printf("%p\n", Buffer2); } 获得的产量: Buffer = 0x56559040 Buffe
-m32
标志选项构建这个小C代码
#include <stdio.h>
#include <stdlib.h>
char *Buffer[10];
int main (void){
printf("%p\n", Buffer);
char *Buffer2 = Buffer + 6;
printf("%p\n", Buffer2);
}
获得的产量:
Buffer = 0x56559040
Buffer2 = 0x56559046
Buffer = 0x56559040
Buffer2 = 0x56559058
为什么获得的输出与预期的不同(0x56559040+6=0x56559046)?这两个值之间的差异
Buffer = 0x56559040
Buffer2 = 0x56559058
是0x18
还是十进制24
在本声明中
char *Buffer2 = Buffer + 6;
数组指示符Buffer
转换为指向其第一个元素的指针。由于数组的元素类型Buffer
是char*
那么表达式的类型为char**/code>
类型char*
(变量Buffer2
的类型)和char**
(初始值设定项的类型)之间没有隐式转换
因此编译器至少应该发出一个警告
尽管如此,使用指针算法还是可以得到这个表达式
Buffer + 6
Buffer + 6
被评估为
the value of the address pointed to by Buffer + 6 * sizeof( char * )
由于系统中char*
(数组元素的大小)类型的指针的大小等于4
,因此您得到的值为0x56559058,即
0x56559040 + 6 * sizeof( char * )
^^^^^^^^^^^^^^^^
4
这就是表达
Buffer + 6
Buffer + 6
指向数组缓冲区的第六个元素。因为您有一个指针数组。指针的大小为4,6*4=24
,即0x18
。指针数组以元素为单位工作,就像数组索引一样。Buffer
是指针数组。因此赋值Buffer2=Buffer+6
应该生成一个关于不匹配指针的编译器警告。请确保启用编译器警告。对于gcc和clang,您应该使用-Wall-Wextra-Werror
命令行选项(至少)。编译器没有警告--char*Buffer2=Buffer+6代码>?您有一个指针数组
,而不是字符
。这是如何编译的?看起来你至少应该有警告。永远不要忽略编译器警告;它们通常是你做了一些古怪事情的标志。