将结构数组分配给另一个结构成员时的类型不完整

时间:2018-02-16 01:26:24

标签: c struct

我已经有一段时间了,我似乎无法弄清楚发生了什么。我在头文件中为结构提供了空的定义,因此它们是不透明的。

typedef struct block_store block_store_t;
typedef struct block block_t;

在另一个文件中我实际定义它们。

struct block_t{
    void* data;
};    

struct block_store_t{
     block_t* b;
 };

void create_struct(){
    block_store_t* bs = malloc(sizeof(block_store_t*));
    block_t* array = malloc(sizeof(block_t*) * 256);

    bs->b = array;  //error: dereferencing pointer to incomplete type
 }

3 个答案:

答案 0 :(得分:2)

typedef struct之前在

等其他结构中使用typedef struct block{ void* data; }block_t; typedef struct block_store{ block_t* b; /* it works bcz you typedefed before only */ }block_store_t;
sizeof(block_store_t*)

同样sizeof(block_store_t)应为struct pointer,因为第一个只分配等于block_store_t* bs = malloc(sizeof(block_store_t));/* allocate memory equal to sizeof structure, not just 4 bytes */ //block_t* array = malloc(sizeof(block_t) * 256); block_t* array = malloc(sizeof(*array) * 256);/*preferable to use bcz it work for any data type */ 大小,但您可能希望分配等于整个结构大小。

def update(self):
    pos, rot = pb.getBasePositionAndOrientation(self.object_id)
    self.rot.angle = rot[3] * -360
    self.rot.axis = rot[:3]  # <-- What I believe is the problem

答案 1 :(得分:2)

发布的代码将block_t显示为类型typedef的{​​{1}},同样struct blockblock_store_t的{​​{1}}。 OP需要定义类型typedefstruct block_store,而不是struct blockstruct block_store。将定义更改为:

struct block_t

另请注意,在发布的代码中对struct block_store_t的调用存在错误。第一个调用需要为struct block { void *data; }; struct block_store { block_t *b; }; 结构分配存储空间,因此应该类似于:

malloc()

第二个调用需要为256个block_store_t结构分配空间:

block_store_t* bs = malloc(sizeof (block_store_t));

在C语言中编写此代码的惯用方法不容易出错,从而避免了在发布的代码中出现的特定错误。这个习惯用法还会导致代码在代码生命周期中类型发生变化时更容易维护:

block_t

此处,使用标识符而不是显式类型作为block_t* array = malloc(sizeof (block_t) * 256); 运算符的操作数。

另请注意,如果分配失败,block_store_t *bs = malloc(sizeof *bs); block_t *array = malloc(sizeof *array * 256); 可能会返回空指针。应检查此条件并由代码处理失败。

由于问题表明应该有多个文件,这里有一个带头文件和两个源文件的示例解决方案:

包含sizeof s,malloc()定义和函数原型的头文件:

typedef

包含函数定义的源文件。请注意,OP代码包含struct,其返回/* bstore.h */ #ifndef BSTORE_H #define BSTORE_H typedef struct block_store block_store_t; typedef struct block block_t; struct block { void *data; }; struct block_store { block_t *b; }; block_store_t * create_store(void); #endif ;似乎这样的函数应该返回指向create_struct()的指针,但OP可能有不同的目标。这里,函数void确实返回指向block_store_t的指针。另请注意,此处通过退出错误消息来处理分配错误; OP可以选择更优雅地处理错误:

create_store()

包含block_store_t的源文件:

/* bstore.c */

#include <stdio.h>
#include <stdlib.h>
#include "bstore.h"

block_store_t * create_store(void)
{
    block_store_t *bs = malloc(sizeof *bs);
    if (bs == NULL) {
        perror("Failure in block store allocation");
        exit(EXIT_FAILURE);
    }

    block_t *array = malloc(sizeof *array * 256);
    if (array == NULL) {
        perror("Failure in array allocation");
        exit(EXIT_FAILURE);
    }

    bs->b = array;

    return bs;
}

答案 2 :(得分:0)

你犯了基本的C错误。 当你进行内存分配时,请确保分配正确的大小。 指向结构的指针的大小最可能与任何其他指针的大小相同,并且当您尝试将该区域作为整个结构域进行处理时会出现错误。

struct block_store* bs = malloc(sizeof(struct block_store));
struct block* array = malloc(sizeof(struct block) * 256);

关于typedef - 它们只是别名而不是右边的“struct name” 确保它们可见。