void *指向struct?

时间:2014-12-07 14:56:24

标签: c arrays struct

我想创建一个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*类型,所以在这里它的香蕉,但将来它也想要得到番茄或洋葱或其他东西,所以它必须是无效的*

3 个答案:

答案 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;
}