void*指向struct?
我想创建一个void*1d数组,每个单元格中的每个指针都指向我编写的结构(由于某些原因,它必须是void*array,而不是sturct array†),到目前为止,我写了以下内容: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
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会使指针从整数变成不带强制转换的指针”。怎么了?@user3729959realloc
需要两个参数。例如new\u指针=realloc(旧指针,新指针大小)