[英]Should the compiler warn on pointer arithmetic with a void pointer?
我正在使用gcc 4.7.2編譯C程序。 我總結了一個帶有一些偏移的void *類型的地址。 (void * + size)應該發出警告。 如果不是那么,如果size是1並且大小是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;
謝謝
你不應該對void指針進行指針運算。
來自C標准
6.5.6-2:另外,兩個操作數都應具有算術類型,或者一個操作數應為指向對象類型的指針,另一個操作數應為整數類型。
6.2.5-19:void類型包含一組空值; 它是一種不完整的類型,無法完成。
GNU C允許通過考慮void
的大小為1
來實現上述目的。
從6.23關於void-和Function-Pointers的算術 :
在GNU C中,指向void的指針和指向函數的指針都支持加法和減法操作。 這是通過將空白或函數的大小視為1來完成的。
所以按照以上幾行我們得到:
address2 = BlockAddress + 1*size; //increase by 50 Bytes
address3 = BlockAddress + 2*size; //increase by 100 Bytes
使用void *
指針算法是GCC擴展而不是標准C.
最好不要做這些事情。 使用char * BlockAddress = malloc(200);
或者將它轉換為address2
和address3
。
這完全有效。 void *包含一個地址,添加一個只是指向內存中的下一個字節。 這里沒什么值得擔心的......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.