【发布时间】:2013-03-05 16:13:54
【问题描述】:
我认为在 gcc 中,void * 和 char * 在指针运算方面的处理方式相同,即 void * “指向”内存中的单个字节,所以下面的代码
void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
确实返回0x984a008 0x984a009。类似地,void ** 指向一个指针,因此递增 1 实际上意味着递增 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;? -
sizeof(void)为 1 或至少给出警告,没用。你不这样做。void类型表示什么?只有void*。 -
我的意思是 void **p, *p1。我知道这段代码可以编译,但我不明白为什么如果 p 最初声明为 void **,p+1 对应于增量 4 个字节,而如果 p1 被声明为 void * 并随后重铸为 void **,算法只为 p1+1 增加 1 个字节
-
为什么,
void **的演员表被忽略了? -
@Ivan:是的,显然它被忽略了。这是一个身份转换(表达式
p已经有类型void**)。身份转换被忽略,除了对值类别有一些影响(例如,转换的结果是一个右值)