我不太了解为什么我得到的地址与我期望的地址不同。
我尝试使用-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)不同?
答案 0 :(得分:1)
这两个值之间的差异
Buffer = 0x56559040
Buffer2 = 0x56559058
是0x18
或十进制24
。
在此声明中
char *Buffer2 = Buffer + 6;
将数组指示符Buffer
转换为指向其第一个元素的指针。由于数组Buffer
的元素类型为char *
,因此表达式的类型为char **
。
类型char *
(变量Buffer2
的类型)和char **
(初始化器的类型)之间没有隐式转换
因此,编译器应至少发出警告。
尽管如此,但仍使用指针算法
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数组的第六个元素。