我正在使用gcc 4.7.2编译C程序。我总结了一个带有一些偏移的void *类型的地址。 (void * + size)应该发出警告。如果不是那么如果大小是1&则将添加多少字节。如果大小是50。 我唯一关心的是应该警告我们正在添加一些无效指针?
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;
谢谢
答案 0 :(得分:10)
你不应该对void指针进行指针运算。
来自C标准
6.5.6-2:另外,两个操作数都应具有算术类型,或者一个操作数应是指向对象类型的指针,另一个操作数应具有整数类型。
6.2.5-19:void类型包含一组空值;这是一个不完整的类型,无法完成。
GNU C通过考虑void
的大小为1
来实现上述目标。
来自 6.23 Arithmetic on void- and Function-Pointers :
在GNU C中,指向void的指针和指向函数的指针都支持加法和减法操作。这是通过将空白或函数的大小视为1来完成的。
所以我们得到以上几行:
address2 = BlockAddress + 1*size; //increase by 50 Bytes
address3 = BlockAddress + 2*size; //increase by 100 Bytes
答案 1 :(得分:9)
使用void *
的指针算法是GCC extension而不是标准C.
最好不要做这些事情。使用char * BlockAddress = malloc(200);
或将其投放到address2
和address3
。
答案 2 :(得分:0)
这完全有效。 void *包含一个地址,添加一个只是指向内存中的下一个字节。这里没什么可担心的......