如何在 "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 的数组是没有意义的,所以通过了解数组中元素数量的大小可以防止出现问题,您还应该了解不透明类型以及如何对结构用户隐藏结构定义,以便强制安全使用。