不能使结构的字段在C中保持不变

时间:2016-04-27 08:13:50

标签: c structure constants

当我声明下面给出的结构时,它会抛出编译错误。

typedef struct{
    const char x; //it is throwing compilation error
    const char y;
}A;

void main()
{
    A *a1;
    a1 = (A*)malloc(2);
}

如何将结构字段(字符xy)设为常量?

3 个答案:

答案 0 :(得分:11)

这应该没问题,但当然你不能分配它们,只能使用初始化。

因此在堆上分配实例没有多大意义。

这有效:

#include <stdio.h>

int main(void) {
    typedef struct {
        const int x, y;
    } A;
    A my_a = { 12, 13 };
    printf("x=%d\ny=%d\n", my_a.x, my_a.y);
    return 0;
}

打印:

x=12
y=13

此外,C中的please don't cast the return value of malloc()

答案 1 :(得分:-1)

你做不到。 如果您在C中使用POO,则可以禁用这些字段的修改:

  • 定义getters:char A_get_x(A *p);char A_get_y(A *p);
  • 在.c中定义结构以隐藏其实现
  • 只在.h文件中写typedef struct A A;,以允许使用该类型。
  • 定义一个构造函数:A *A_new();,它返回带有x和y所需值的A。

通过执行此操作,您只能修改构造函数中的值,并且在创建对象后,值将不会更改(如果您不使用指针强制值等等。)

答案 2 :(得分:-1)

首先,您应该使用malloc来分配结构的大小,而不是幻数2.另外,不要强制转换malloc返回值,它会自动提升为兼容的指针类型

a1 = malloc(sizeof(A));

其次,构造成员const并没有多大用处。

A *a1;
a1 = malloc(sizeof(A));

a1的成员未初始化为此处的任何状态,但编译器禁止对它们进行任何赋值,因为它被定义为const,因此a1->x = 'a';将无法编译。

A a2;
a2->x = 'a'; // won't compile too

唯一有效的用例是:

A a3 = {'a', 'b'};