我正在使用 gcc 4.7.2 编译 C 程序。我有一个带有一些偏移量的 void * 类型的地址。 (void* + size) 应发出警告。如果不是,那么如果 size 为 1 且如果 size 为 50,则将添加多少字节。
我唯一关心的是应该警告我们正在向 void 指针添加一些内容?
12 int size = 50;
/*Allocate a block of memory*/
14 void *BlockAddress = malloc(200);
15 if(!BlockAddress)
16 return -1;
17 address1 = (int *)BlockAddress;
18 address2 = BlockAddress + 1*size;
19 address3 = BlockAddress + 2*size;
Thanks
您不应该对 void 指针进行指针算术。
来自C标准
6.5.6-2:对于加法,两个操作数都应具有算术类型,或者一个操作数应是指向对象类型的指针,另一个操作数应具有整数类型。
6.2.5-19:void 类型包含一组空值;它是一种不完整类型,无法完成。
GNU C 通过考虑以下的大小来允许上述情况void
is 1
.
From 6.23 void 指针和函数指针的算术 http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html:
在 GNU C 中,指向 void 的指针和指向函数的指针支持加法和减法运算。这是通过将 void 或函数的大小视为 1 来完成的。
所以根据上面的几行我们得到:
address2 = BlockAddress + 1*size; //increase by 50 Bytes
address3 = BlockAddress + 2*size; //increase by 100 Bytes
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)