Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我不知道';我不懂C指针_C_Pointers_Pointer Arithmetic - Fatal编程技术网

我不知道';我不懂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?您有一个
指针数组
,而不是
字符
。这是如何编译的?看起来你至少应该有警告。永远不要忽略编译器警告;它们通常是你做了一些古怪事情的标志。