[英]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 *a
, a + offset
違反6.5.6加法運算符 ,C標准的第8段 :
當將具有整數類型的表達式添加到指針或從指針中減去時, 結果將具有指針操作數的類型 。 如果指針操作數指向數組object的元素,並且數組足夠大...
void *
沒有類型,它不能指向實際的對象。
正如其他人指出的那樣,您必須將void *
為另一種類型,最有可能的char *
是合適的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.