簡體   English   中英

無效*分配給無效**

[英]void * assignment to void **

需要實現一個具有一些參數的api;它具有輸入的類型(const void *),輸出的類型(void **); api希望為輸入分配一些偏移量; 例如,

void getOffset(const void* a, void** b)
{
    int offset = getsomeoffset();
    *b = a + offset; 
} 

這在編譯器中會有一些抱怨。 編寫此代碼的正確方法是什么? 輸入的類型可以是float,int,double。

您不能對void *指針應用指針算術。 所指向的目標沒有任何類型,因此沒有可用於計算偏移量的大小。

因此,您需要在應用偏移量之前強制轉換指針:

*b = ((char *)a) + offset; 

使用此語句,偏移量被解釋為字節數。

這里的問題是偏移量。 void沒有大小,因此C不允許對void *進行指針運算。 假設您要使用字節地址,則應通過char *算法:

void getOffset(const void* a, void** b)
{
    int offset = getsomeoffset();
    char *p = a;   // automatic conversion from void * to char *
    p += offset;   // char pointer arithmetics
    *b = p;        // automatic conversion for char * to void *
    // or directly:        *b = ((char *) a) + offset; 
}

給定void *aa + offset違反6.5.6加法運算符 ,C標准的第8段

當將具有整數類型的表達式添加到指針或從指針中減去時, 結果將具有指針操作數的類型 如果指針操作數指向數組object的元素,並且數組足夠大...

void *沒有類型,它不能指向實際的對象。

正如其他人指出的那樣,您必須將void *為另一種類型,最有可能的char *是合適的。

暫無
暫無

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

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