我想创建一个void * 1d数组,每个单元格中的每个指针指向我写的结构(它必须是void *数组,而不是sturct数组由于某些原因†),所以我写的这个:
typedef struct
{
int weight;
int amount;
} Banana;
void* makeBanana(){
Banana new;
new.weight = 1;
new.amount = 6;
void* p = &new; //its Legal??
return p;
现在,在那之后,我想将这个p存储在一个void *指针的动态数组中,每个void *指针指向另一个Banana,我写道:
void* ptrToBananaArray = (void*)malloc(3); //3 is just example of lenght
ptr[0] = makeBanana();
这样可以吗?如果不是,那么正确的方法是什么?
†使用void*
代替Banana*
的原因:
因为我有一个通用的代码elswhere只有void*
类型,所以在这里它的香蕉,但将来它也想要得到番茄或洋葱或其他东西,所以它必须是无效的*
答案 0 :(得分:2)
返回指向函数内部创建的变量的指针是非法的,因为保存变量的内存不再被静态分配,并且不同的变量可能会覆盖它。
答案 1 :(得分:1)
你有一个错字。
Banan new;
应该是Banana new;
除此之外,你的函数makeBanana()存在根本问题。你不应该返回局部变量的地址,因为一旦函数返回它就会无效。
您应该使用malloc分配结构:
Banana* new = malloc( sizeof( *new ) );
new->weight = 1;
并返回指针:
return new ;
最后,更改变量的名称会更好,而不是将读者与new
混淆。
答案 2 :(得分:0)
示例代码
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int weight;
int amount;
} Banana;
void *makeBanana(){
Banana *new;
new = malloc(sizeof(Banana));
if(new != NULL){
new->weight = 1;
new->amount = 6;
}
return new;
}
int main(void){
void ** ptr = (void**)malloc(3*sizeof(void*));
ptr[0] = makeBanana();
Banana *bananap = ptr[0];
printf("weight: %d, amount: %d\n", bananap->weight, bananap->amount);
free(ptr[0]);
free(ptr);
return 0;
}