簡體   English   中英

如何從結構初始化 void* 指針

[英]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.

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