我正在尝试使用malloc为一个struct指针数组分配堆内存,但我无法让它工作。下面是我的代码,但是当我用gcc编译时,我遇到了这样的错误“错误:' - >'的无效类型参数”
数组我想设置一个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;
}
}
答案 0 :(得分:4)
替换' - &gt;'通过'。'。因为'struct_ptr_array [i]'已经取消引用指针。
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
struct_ptr_array
是一个指针,但是你将它编入索引,所以你得到一个实际的__mystruct_t
,而不是指针。因此,只需使用:
struct_ptr_array[i].id = i;
struct_ptr_array[i].status = false;
答案 3 :(得分:1)
用
替换两行struct_ptr_array[i].id = i;
struct_ptr_array[i].status = false;