[英]How to initialize an void* pointer from struct
我有一個struct Element
。 當我嘗試將元素數組初始化為NULL
,出現錯誤:從類型void *
分配給類型Element
時類型不兼容。
如何初始化void *
數組?
typedef struct _Element Element;
struct _Element {
void* data;
};
typedef struct _ArrayList ArrayList;
struct _ArrayList {
int size;
Element *elements;
};
int main() {
ArrayList *list;
list->size = 100;
list->elements = (Element*)calloc(sizeof(Element), list->size);
for (i = 0; i < list->size; i++) {
/*
* error: incompatible types when assigning to type
* ‘Element’ from type ‘void *’
*/
list->elements[i] = NULL;
}
}
首先,您從未為list
對象分配內存! 您的list
指針未初始化且無處指向。 嘗試對其應用->
運算符會導致未定義的行為。
我不知道你的最終意圖是什么,但它應該是這樣的
ArrayList *list = malloc(sizeof *list);
list->size = 100;
...
或者
ArrayList list;
list.size = 100;
...
其次,您的void *
指針實際上是Element
結構中名為data
的命名字段
for(i = 0; i < list->size; i++)
list->elements[i].data = NULL;
第三,因為你使用了calloc
,內存已經用全零位模式(包括你的data
)“初始化”了。 形式上, void *
這種位模式不能保證表示空指針,但在大多數平台上它確實如此。
PS 不要投射calloc
的結果
list->elements = calloc(sizeof(Element), list->size);
或事件更好
list->elements = calloc(sizeof *list->elements, list->size);
除了所有邏輯錯誤之外,編譯器錯誤是嘗試為結構類型變量分配值 (NULL) 的結果。 結構體包含void *
的事實是巧合。 你會得到同樣的錯誤:
typedef struct _Element Element;
struct _Element{
int data;
};
Element e;
e = NULL;
這很可能是您打算做的錯誤,即為結構內的變量賦值:
for(i = 0; i < list->size; i++)
list->elements[i].data = NULL;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.