在下面的代码中,我如何以及在何处动态初始化Class结构中的数组?例如,如果我改为使用double * var,那么malloc语句在哪里?
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
struct Class;
struct Class *new_class();
void class_function(struct Class*,double);
#endif
myclass.c
#include "myclass.h"
#include <stdlib.h>
struct Class {
double var;
};
struct Class *new_class()
{
return (struct Class *)malloc(sizeof(struct Class));
}
void class_function(struct Class *inst, double num)
{
inst->var = num;
}
的main.c
#include "myclass.h"
int main()
{
struct Class *c1 = new_class();
class_function(c1,0.15);
return 0;
}
我尝试将new_class函数修改为
struct Class *new_class(int len)
{
Class c1 = (struct Class *)malloc(sizeof(struct Class));
c1.var = (double)malloc(len*sizeof(double));
return c1;
}
没有运气。我是否需要创建单独的功能进行分配?完成此任务的最佳方法是什么?感谢。
答案 0 :(得分:2)
这应该有效,首先将struct
定义更改为
struct Class
{
double *var;
size_t len;
};
然后
struct Class *new_class(int len)
{
struct Class *c1;
c1 = malloc(sizeof(struct Class));
if (c1 == NULL)
return NULL;
c1->var = malloc(len * sizeof(double));
if (c1->var == NULL)
{
free(c1);
return NULL;
}
c1->len = len;
return c1;
}
你的class_function()
应该检查指针是否为NULL
,相信我,你将在今后为此感谢我
void set_class_value(struct Class *inst, int index, double num)
{
if ((inst == NULL) || (inst->var == NULL) || (index < 0) || (index >= inst->len))
return;
inst->var[index] = num;
}
你也可以
double get_class_value(struct Class *inst, int index)
{
if ((inst == NULL) || (inst->var == NULL) || (index < 0) || (index >= inst->len))
return 0.0; /* or any value that would indicate failure */
return inst->var[index];
}
完成后必须具有释放资源的功能
void free_class(struct Class *klass)
{
if (klass == NULL)
return;
free(klass->var);
free(klass);
}
现在main()
int main()
{
struct Class *c1;
c1 = new_class(5);
if (c1 == NULL)
{
perror("Memory exhausted\n");
return -1;
}
set_class_value(c1, 0, 0.15);
printf("%f\n", get_class_value(c1, 0));
free_class(c1);
return 0;
}
我认为这应该有所帮助,虽然没有太多解释,我认为代码本身就说明了。
请注意,我在结构中添加了len
字段,因为否则struct
存储double
数组是没有意义的,所以知道大小在数组中可以防止出现问题的元素数量,您还应该了解opaque类型以及如何从结构用户中隐藏结构定义,以便强制安全使用。