簡體   English   中英

我可以對C中的void *指針進行算術運算嗎?

[英]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 *。 但它對指針算法沒有提及。

  • gcc(4)允許它並將其視為char *
  • g ++拒絕它
  • gcc -pedantic警告它
  • vs2010 c和c ++都拒絕它

不,這不合法。 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的步驟是沒有意義的。使用它的人的共同期望是可能的最小步驟。

您可能想要查看此問題的最高投票答案

C中空指針的指針算法

你的猜測是正確的。

在標准ISO C99第6.2.5節第26段中,它聲明void指針和字符指針將具有相同的表示和對齊要求(釋義)。

我不認為你可以,因為它不知道它的類型,因此無法尋找正確的字節數。

首先將它轉換為類型,即(int)

暫無
暫無

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

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