我认为在gcc中,当涉及到指针算术时,void *和char *被视为相同的方式处理,即void *“指向”内存中的单个字节,因此以下代码:
void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
实际上返回的是 0x984a008 0x984a009
。同样地,void ** 指向一个指针,因此增加一个指针实际上意味着增加4个字节(在32位操作系统上),即
void **p;
p = (void **) malloc(sizeof(void *));
printf("%p %p\n",p,p+1);
返回结果为0x984a008 0x984a00c
。然而,以下代码让我感到困惑。
void **p, *p1;
p = (void **) malloc(sizeof(void *));
p1 = (void **) p;
printf("%p %p\n",p1,p1+1);
自从它再次返回
0x984a008 0x984a009
,这是怎么回事?
void **p, **p1;
而不是void **p, *p1;
? - Paul Rsizeof(void)
的值为1或者至少会给出一个警告,这是无用的。你不需要这样做。void
类型表示什么?只有void*
。 - Tony The Lionvoid **
转换时被忽略了? - Ivanp
已经具有类型void **
)。身份转换除了对值类别产生一些影响(例如,转换的结果是rvalue)之外,都会被忽略。 - Ben Voigt