保护const结构的动态数组成员

时间:2013-12-10 00:19:54

标签: c

考虑将struct作为成员的动态分配数组,例如:

struct matrix {
    unsigned cols;
    unsigned rows;
    double* data;
};

如何编写像print_matrix(const matrix);这样的函数来保证数据data不会被修改?

我可以定义类似

的内容
struct const_matrix {
    const unsigned cols;
    const unsigned rows;
    const double* data;
};

然后将struct matrix隐式转换为struct const_matrix

Here是一个小例子,为什么第一个版本不起作用。

2 个答案:

答案 0 :(得分:1)

是的,你的直觉是正确的。您可以像您一样定义struct const_matrix,然后转换为它:

void print_matrix(struct const_matrix *m)
{
    // This bad implementation tries to change data.
    // It does not compile.
    m->data[0] = 100;
}

要调用它,从(struct matrix *)转换为(struct const_matrix *)。例如:

{
    struct matrix m;
    m.cols = 4;
    m.rows = 4;
    m.data = calloc(sizeof(double), m.cols*m.rows);

    ...

    print_matrix((struct const_matrix *)&m);
}

请注意,您必须强制转换指针类型(即从(struct matrix *)转换为(struct const_matrix *),因为C不允许您将一个结构转换为另一个结构(即从(struct matrix)转换为<{1}}是不允许的。)

答案 1 :(得分:0)

你可以在那里有另一个const

double * const data; // non constant pointer to constant data

甚至

double const * const data; // constant pointer to constant data