[英]Can I do arithmetic on void * pointers in C?
這是有效的
void *p = &X; /* some thing */
p += 12;
如果是的話,p現在指向什么? 我有(第三方)代碼執行此操作(並編譯干凈)我的猜測是void *被視為char *。 我信賴的K&R對此話題保持沉默(ish)
編輯:我的小測試應用程序在gcc 4.1.1上正常運行並將void *視為char *。 但是g ++ barfs
我知道如何正確地做到這一點。 我需要知道是否必須清理此代碼庫以找到它完成的所有位置。
BTW gcc -pedantic發出警告
摘要:
C規范含糊不清。 它表示在表示和用作函數參數方面void * = char *。 但它對指針算法沒有提及。
不,這不合法。 void*
不能任意增加。 首先需要將其強制轉換為特定類型。
如果你想按特定的字節數遞增它,那么這就是我使用的解決方案。
p = ((char*)p) + 12;
char
類型很方便,因為它的定義大小為1個字節。
編輯
有趣的是它在gcc上運行並發出警告。 我在Visual Studio 2010上測試並驗證它不能編譯。 我對標准的理解有限,會說gcc出現錯誤。 可以添加以下編譯標志嗎?
-Wall -ansi -pedantic
引用規范:
§6.5.6/ 2 :對於加法,兩個操作數都應具有算術類型,或者一個操作數應是指向對象類型的指針,另一個操作數應具有整數類型。 (遞增相當於添加1.)
指向void的指針不是指向對象類型的指針,根據以下摘錄:
§6.2.5/ 1 :[...]類型被划分為對象類型(完全描述對象的類型),函數類型(描述函數的類型)和不完整類型(描述對象但缺少確定其所需信息的類型)大小)。
§6.2.5/ 19 :void類型包含一組空值; 它是一種不完整的類型,無法完成。
因此, 沒有為指向void類型的指針定義指針算術。
這取決於編譯器。 那些允許它將sizeof(*(void *))視為1。
編輯:它只適用於無效指針算術。 在這種情況下使用sizeof(int)或0的步驟是沒有意義的。使用它的人的共同期望是可能的最小步驟。
您可能想要查看此問題的最高投票答案
你的猜測是正確的。
在標准ISO C99第6.2.5節第26段中,它聲明void指針和字符指針將具有相同的表示和對齊要求(釋義)。
我不認為你可以,因為它不知道它的類型,因此無法尋找正確的字節數。
首先將它轉換為類型,即(int)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.