2014-02-25 34 views
0

我想用malloc来分配一堆结构指针的堆内存,但我不能让它工作。下面是我的代码,但是当我用gcc编译时,我得到了这样的错误“error:' - >'的无效类型参数”malloc结构指针的数组,需要帮助

数组我想设置一个mystruct_pointer数组,它应该指向实际__mystruct_t,我想我可以在其成员字段上使用“ - >”。我的代码出错了?我认为它应该工作。感谢

typedef struct 
{ 
    int id; 
    bool status; 
} __mystruct_t; 

typedef __mystruct_t* mystruct_pointer; 

mystruct_pointer struct_ptr_array; 

void my_init(int number) 
{ 
    struct_ptr_array = (mystruct_pointer) malloc(sizeof(__mystruct_t) * number); 

    int i; 
    for (i = 0; i < number; i++) /* initialize the array of struct pointers */ 
    { 
     struct_ptr_array[i]->id = i; 
     struct_ptr_array[i]->status = false; 
    } 
} 

回答

4

用'。'替换' - >'。由于'struct_ptr_array [i]'已经取消引用指针。

1

struct_ptr_array是一个指针,但它的索引,所以你得到的实际__mystruct_t,而不是指针。因此,简单地使用:

 struct_ptr_array[i].id = i; 
    struct_ptr_array[i].status = false; 
2

像这些问题来自做晦涩的事情。您键入了隐藏指针,并立即让您的程序无法读取。这是typedef实现的唯一一件事。所以不要用typedef隐藏指针,这是非常糟糕的做法。

其他问题:

  • 避免双下划线,因为这是保留给编译器标识符。

  • 不要施加malloc的结果,因为这样做在C语言中完全没有意义,而且在旧的C编译器上也有潜在危险。

  • 处理malloc失败的情况,因为没有堆空间可用。

  • 不要在全局范围内使用变量,导致意大利面条代码的做法是非常糟糕的做法。而从来就没有理由C.

这样做

的代码应该是固定的,如下所示:

typedef struct 
{ 
    int id; 
    bool status; 
} mystruct_t; 



static mystruct_t* struct_ptr_array; 

void my_init(int number) 
{ 
    struct_ptr_array = malloc(sizeof(mystruct_t) * number); 

    if(struct_ptr_array == NULL) 
    { 
     handle_error(); 
     return ; 
    } 

    for (int i = 0; i < number; i++) /* initialize the array of struct pointers */ 
    { 
     struct_ptr_array[i].id = i; 
     struct_ptr_array[i].status = false; 
    } 
} 
+0

替换两行能否请您解释一下为什么你坚持“mystruct_t *”,而不是采取“mystruct_t **”指针数组? – Subhajit

+0

@Subhajit这里没有指针数组....并且也不需要任何一个。 – Lundin

+0

了解,struct_ptr_array保存结构数组的地址,struct_ptr_array [i]表示一个单一的结构实例,如果我错了,请纠正我的问题 – Subhajit

1

通过

struct_ptr_array[i].id = i; 
struct_ptr_array[i].status = false; 
+0

您是否介意对格式化多加注意?顺便说一句。另外,不要误解我的意思,但你的答案看起来像是已经存在的Evert的答案的副本。我没有指责你,但如果你这样做,那不是一个'得分'的好方法。 – quetzalcoatl