当我声明下面给出的结构时,它会抛出编译错误。
typedef struct{
const char x; //it is throwing compilation error
const char y;
}A;
void main()
{
A *a1;
a1 = (A*)malloc(2);
}
如何将结构字段(字符x
和y
)设为常量?
答案 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
答案 1 :(得分:-1)
你做不到。 如果您在C中使用POO,则可以禁用这些字段的修改:
char A_get_x(A *p);
和char A_get_y(A *p);
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'};