如何在 "object oriented" C 中动态初始化数组?
How to dynamically initialize array in "object oriented" C?
在下面的代码中,如何以及在何处动态初始化 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;
}
运气不好。我需要为分配创建一个单独的函数吗?完成此任务的最佳方法是什么?谢谢。
这应该可以,首先将 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
的数组是没有意义的,所以通过了解数组中元素数量的大小可以防止出现问题,您还应该了解不透明类型以及如何对结构用户隐藏结构定义,以便强制安全使用。
在下面的代码中,如何以及在何处动态初始化 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;
}
运气不好。我需要为分配创建一个单独的函数吗?完成此任务的最佳方法是什么?谢谢。
这应该可以,首先将 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
的数组是没有意义的,所以通过了解数组中元素数量的大小可以防止出现问题,您还应该了解不透明类型以及如何对结构用户隐藏结构定义,以便强制安全使用。