【问题标题】:How to initialize an void* pointer from struct如何从 struct 初始化 void* 指针
【发布时间】:2015-11-08 09:22:27
【问题描述】:

我有一个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;
    }
}

【问题讨论】:

  • 请注意,_Element 是保留标识符,不应使用。每7.1.3 Reserved identifiers of the C11 standard:“所有以下划线开头的标识符以及大写字母或另一个下划线始终保留供任何使用。”和“所有以下划线开头的标识符始终保留用作在普通和标记名称空间中具有文件范围的标识符。”

标签: c struct void-pointers


【解决方案1】:

首先,您从未为list 对象分配内存!您的 list 指针未初始化且无处指向。尝试将 -&gt; 运算符应用于它会导致未定义的行为。

我不知道你的最终意图是什么,但应该是这样的

ArrayList *list = malloc(sizeof *list);
list->size = 100;
...

ArrayList list;
list.size = 100;
...

其次,您的 void * 指针实际上是一个名为 data 的命名字段,位于 Element 结构内

for(i = 0; i < list->size; i++)
    list->elements[i].data = NULL; 

第三,因为您使用了calloc,所以内存已经以全零位模式“初始化”了(包括您的data 文件)。形式上,void * 中的这种位模式不能保证代表一个空指针,但在大多数平台上它确实可以。

附:不要投射calloc的结果

 list->elements = calloc(sizeof(Element), list->size);

或事件更好

 list->elements = calloc(sizeof *list->elements, list->size);

【讨论】:

  • 很好的答案!如果你初始化 list->elements = calloc(sizeof *list->elements, list->size); 我在徘徊为什么 sizeof *list-> 元素?你的意思是 sizeof (list->elements)?
  • 很好的答案!如果你初始化 list->elements = calloc(sizeof *list->elements, list->size); 我在徘徊为什么 sizeof *list-> 元素?你的意思是 sizeof (list->elements)?
  • 不,具体应该是sizeof *list-&gt;elements(或者sizeof list-&gt;elements[0],是一样的)。 sizeof list-&gt;elements 会给你 pointer 大小,这不是我们需要的。我们需要 element 大小。
  • @user1323328:请注意,即使list-&gt;elements 尚未初始化,也可以在sizeof 下使用*list-&gt;elements。在这种情况下 Sizeof 参数不会被评估。
【解决方案2】:

除了所有逻辑错误之外,编译器错误是尝试将值 (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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2014-05-14
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多