【问题标题】:void* points to struct?void* 指向结构?
【发布时间】:2014-12-07 14:56:24
【问题描述】:

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

【问题讨论】:

  • NG。 void* p = &new;return p;p 指向局部变量。在外部范围内无效。
  • makeBanana() 应该返回一个指向没有意义的 void 的指针。
  • 如果你使用void*,你的代码会更难写和读。您指定了“由于某些原因而不是 sturct 数组” - 这些原因是什么?您应该描述它们,以便我们了解它们是否比干净的代码更重要。
  • @anatolyg 是因为我有一个通用代码 elswhere 只能获得 void* 类型,所以这里是香蕉,但将来它还想获得番茄或洋葱或其他东西,所以它必须无效*

标签: c arrays struct


【解决方案1】:

返回指向在函数内部创建的变量的指针是非法的,因为保存变量的内存不再是静态分配的,并且不同的变量可能会覆盖它。

【讨论】:

    【解决方案2】:

    你有一个错字。

    Banan new;
    

    应该是Banana new; 除此之外,您的函数 makeBanana() 中存在基本问题。你不应该返回局部变量的地址,因为它在函数返回时是无效的。

    您应该使用 malloc 分配结构:

    Banana* new = malloc( sizeof( *new ) );
    new->weight = 1;
    

    并返回指针:

    return new ;
    

    最后还是改个变量名就好了,不要把读者和new混淆了。

    【讨论】:

    • 我认为发布另一个答案没有多大意义,请随时改进。
    【解决方案3】:

    示例代码

    #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;
    }
    

    【讨论】:

    • 这段代码与原始代码有何不同?为什么要进行这些更改?
    • 1) 返回堆区域(通过 malloc) 2) void** 作为 void* 的数组
    • 原因 1) 直到堆的生命周期被释放。 2)void* ptrToBananaArray = (void*)malloc(3); 误会了很多道理。第一个void 不等于void*
    • @BLUEPIXY 如果我想将 ptr 增加 1,我使用 realloc 如下: ptr = (void**)realloc(1*sizeof(void*));但它告诉我:“警告:传递 'realloc' 的参数 1 会在没有强制转换的情况下从整数生成指针”.. 有什么问题?
    • @user3729959 realloc 需要两个参数。例如new_pointer = realloc(old_pointer, new_size)
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多