Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
void*指向struct?_C_Arrays_Struct - Fatal编程技术网

void*指向struct?

void*指向struct?,c,arrays,struct,C,Arrays,Struct,我想创建一个void*1d数组,每个单元格中的每个指针都指向我编写的结构(由于某些原因,它必须是void*array,而不是sturct array†),到目前为止,我写了以下内容: typedef struct { int weight; int amount; } Banana; void* makeBanana(){ Banana new; new.weight = 1; new.amount = 6; void* p = &new; //its Legal?? retu

我想创建一个void*1d数组,每个单元格中的每个指针都指向我编写的结构(由于某些原因,它必须是void*array,而不是sturct array†),到目前为止,我写了以下内容:

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*指针都指向香蕉,我写了以下内容:

void* ptrToBananaArray  = (void*)malloc(3); //3 is just example of lenght
ptr[0] = makeBanana();
这样行不行?如果没有,正确的方法是什么


†使用
void*
代替
Banana*
的原因: 这是因为我有一个通用代码ELS,它只能得到
void*
类型,所以这里是香蕉,但将来它还想得到番茄、洋葱或其他东西,所以它必须是void*

你有一个输入错误

Banan new;
应该是新的 除此之外,函数makeBanana()还有一个根本问题。您不应该返回局部变量的地址,因为一旦函数返回,它就无效

应使用malloc分配结构:

Banana* new = malloc( sizeof( *new ) );
new->weight = 1;
并返回指针:

return new ;

最后,最好更改变量的名称,不要将读者与
new

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

示例代码

#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;
}
#包括
#包括
类型定义结构
{
整数权重;
整数金额;
}香蕉;
void*makeBanana(){
香蕉*新;
新=malloc(sizeof(香蕉));
如果(新!=NULL){
新建->权重=1;
新建->金额=6;
}
归还新的;
}
内部主(空){
void**ptr=(void**)malloc(3*sizeof(void*);
ptr[0]=makeBanana();
香蕉*bananap=ptr[0];
printf(“重量:%d,金额:%d\n”,bananap->重量,bananap->金额);
自由(ptr[0]);
免费(ptr);
返回0;
}

NG<代码>无效*p=&new;返回p
p
是指向局部变量的点。范围外无效。makeBanana()应该返回指向无效的void的指针。如果使用
void*
,代码将更难编写和读取。您指定“由于某些原因而不是sturct数组”-这些原因是什么?你应该描述它们,这样我们才能理解它们是否比干净的代码更重要。@Anatoly its因为我有一个通用代码Els,其中只有void*类型,所以这里是香蕉,但将来它还想得到一个番茄或洋葱或其他东西,所以它一定是void*我觉得发布另一个答案没有多大意义,请随意改进。此代码与原始代码有何不同?为什么要进行这些更改?1)返回堆区域(由malloc)2)
void**
作为
void*
Reason 1)的数组,直到释放堆的生存期。2)
void*ptrtobanaarray=(void*)malloc(3)错误很有道理。第一个
void
不等于
void*
@BLUEPIXY,如果我想将ptr增加1,我使用realloc如下:ptr=(void**)realloc(1*sizeof(void*);但它告诉我:“警告:传递'realloc'的参数1会使指针从整数变成不带强制转换的指针”。怎么了?@user3729959
realloc
需要两个参数。例如
new\u指针=realloc(旧指针,新指针大小)