2016-04-27 25 views
5

Khi tôi khai báo cấu trúc được đưa ra dưới đây, nó sẽ ném lỗi biên dịch.Không thể tạo trường cấu trúc là hằng số trong C

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

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

Làm thế nào tôi có thể làm cho lĩnh vực cấu trúc (nhân vật xy) như liên tục?

+3

Bạn có thể làm cho toàn bộ dụ liên tục, khi bạn tạo ra nó, vì các biến liên tục có thể được khởi tạo: – BlackMamba

+0

@BlackMamba mà làm việc, cảm ơn. –

Trả lời

11

Điều đó sẽ ổn, nhưng tất nhiên bạn không thể chỉ định cho họ, chỉ sử dụng khởi tạo.

Vì vậy, không có nhiều ý nghĩa khi phân bổ một phiên bản trên vùng lưu trữ.

này hoạt động:

#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; 
} 

It in:

x=12 
y=13 

Ngoài ra, please don't cast the return value of malloc() trong C.

+0

tại sao điều này là ok cho cấu trúc bên trong? nói rằng detial – BlackMamba

+0

@BlackMamba Cái gì? Vị trí của 'typedef' không quan trọng ở đây, tôi chỉ thích không làm lộn xộn phạm vi toàn cục. – unwind

+0

Bạn di chuyển 'typedef struct { const int x, y; } A; 'bên trong' int main() {} ' – BlackMamba

-1

Bạn không thể. Với Poo trong C bạn có thể vô hiệu hóa việc sửa đổi các lĩnh vực này, nếu quý vị:

  • xác định thu khí: char A_get_x(A *p);char A_get_y(A *p);
  • xác định các cấu trúc trong .c để che giấu thực hiện
  • chỉ viết typedef struct A A; trong tệp .h, để cho phép sử dụng loại đó.
  • xác định hàm tạo: A *A_new(); trả về A với các giá trị mong muốn trên x và y.

Bằng cách này, bạn chỉ có thể sửa đổi các giá trị trong các nhà xây dựng, và sau khi đối tượng được tạo ra các giá trị wont làm thay đổi (nếu bạn không buộc các giá trị với con trỏ vv ..)

-1

Trước tiên, bạn nên sử dụng malloc để phân bổ kích thước của cấu trúc, chứ không phải số ma thuật 2. Ngoài ra, không bỏ giá trị trả về malloc, nó sẽ được tự động thăng hạng thành loại con trỏ tương thích.

a1 = malloc(sizeof(A)); 

Thứ hai, không thực sự có nhiều công dụng để tạo cấu trúc thành viên const.

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

a1 's các thành viên không được khởi tạo trạng thái bất kỳ ở đây, tuy nhiên trình biên dịch cấm bất kỳ nhiệm vụ cho họ, vì nó được định nghĩa là const, do đó a1->x = 'a'; sẽ không biên dịch.

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

Các trường hợp sử dụng chỉ có giá trị là:

A a3 = {'a', 'b'}; 
Các vấn đề liên quan