簡體   English   中英

編譯器是否應該使用void指針警告指針算術?

[英]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); 或者將它轉換為address2address3

這完全有效。 void *包含一個地址,添加一個只是指向內存中的下一個字節。 這里沒什么值得擔心的......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM