我认为在gcc中,void*和char*在指针运算方面的处理方式相同,即void*"指向"内存中的单个字节,因此下面的代码
void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
Run Code Online (Sandbox Code Playgroud)
确实回来了0x984a008 0x984a009.类似地,void**指向一个指针,因此增加1实际上意味着增加4个字节(在32位OS上),即
void **p;
p = (void **) malloc(sizeof(void *));
printf("%p %p\n",p,p+1);
Run Code Online (Sandbox Code Playgroud)
回报0x984a008 0x984a00c.但是,以下代码让我感到困惑
void **p, *p1;
p = (void **) malloc(sizeof(void *));
p1 = (void **) p;
printf("%p %p\n",p1,p1+1);
Run Code Online (Sandbox Code Playgroud)
因为它又回来了0x984a008 0x984a009.这里发生了什么?
void暂时忽略指针运算的可能未定义行为......
类型p1是void *.
您不能通过为其指定不同类型的值来更改变量的类型.p1将永远留下来void *.
分配给它的任何不同类型的表达式将被隐式地转换为void *(或者如果不能则给出错误).
因此它与第一个例子基本相同.
编辑:
据我所知,从一种指针类型转换到另一种指针类型实际上并没有做任何事情,其主要目的是进行类型检查.
指针只是一个内存地址,一个数字,所以内存看起来像:(分配后)
p1 p2
void * void** <- these types are fixed and known during compilation
------ ------
|1234| |1234| at address 1234 = the 4 bytes from malloc
------ ------
^
|
this value is the only thing that will change by assigning p1 to a different value
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3921 次 |
| 最近记录: |