如何在“面向对象”C中动态初始化数组?

时间:2015-02-10 19:09:46

标签: c oop dynamic-memory-allocation

在下面的代码中,我如何以及在何处动态初始化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;
}
没有运气。我是否需要创建单独的功能进行分配?完成此任务的最佳方法是什么?感谢。

1 个答案:

答案 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类型以及如何从结构用户中隐藏结构定义,以便强制安全使用。