簡體   English   中英

將指針數組強制轉換為“void **”的算術

[英]Arithmetic with array of pointers casted to `void **`

我知道 C 標准承諾指向任何對象的指針都可以往返於void *並返回。 換句話說,

T obj;
assert(&obj == (T *) (void *) &obj);

現在,我想知道指針算法。 它是如何遵循的/它在哪里說的

T *arr[2] = {0};
assert(arr[1] == (T *) (((void **)arr)[1]))

作品? 這還能保證嗎?

我有一種預感,答案是“不能保證”甚至“這是 UB”。 原因是,據我“所知”, void *的表示不需要等於其他指針的表示。 例如,如果 void 指針的大小比其他指針大,則void **上的指針算法可能無法工作。 所以除非以上是合法的,我想知道如果我想用通用代碼對指針數組進行操作,我應該怎么做。

我有一種預感,答案是“不能保證”甚至“這是 UB”。 原因是,據我“所知”, void *的表示不需要等於其他指針的表示。 例如,如果 void 指針的大小比其他指針大,則void **上的指針算法可能無法工作。

你是對的,你的推理是對的,至少在實踐意義上是對的。 從標准的角度來看,有點不清楚以哪種方式來論證評估表達式((void **)arr)[1]會產生未定義的行為。 我傾向於這樣做:該表達式等效於*(((void **)arr) + 1) ,並且由於(void **)arr實際上並未指向數組,因此添加指針會產生未定義的行為void * 但還有一個事實,即*(((void **)arr) + 1)void * ,並且,根據嚴格的別名規則,如果它實際上不引用,則評估會產生未定義的行為一個void *

我想知道如果我想用通用代碼對指針數組進行操作,我應該怎么做。

C 沒有表示通用指針數組類型的機制。 特別是, void *arr[DIMENSION]形式的數組和void **類型的指針不是通用的。 但是,您可以使用這些特定類型的數組和指針,並使用從任意其他(對象)指針類型轉換的指針加載它們。

根據您要執行的特定操作,可能還有其他選擇。

暫無
暫無

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

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