Trong mã của bạn
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
là sai vì nhiều lý do, như
- Bạn đang sử dụng một loại không xác định (như bạn nói)
- Bạn đang phân bổ cách ít bộ nhớ (phân bổ cho a pointer-to-type thay vì loại)
Nhưng bạn biên dịch không thể giúp gì nhiều trong _this_case cho loại đặc biệt này của lỗi, như
một con trỏ đến (bất kỳ) gõ vào một nền tảng có kích thước xác định, cho rằng cấu trúc (I E loại biến mà nó trỏ đến) không cần phải hoàn thành (được xác định). Đây là lý do chúng ta có thể có cấu trúc tự tham khảo, đúng không?
malloc()
không có ý tưởng về loại biến mục tiêu. Nó chỉ đọc đối số cho kích thước cần thiết, trả về một con trỏ (có kiểu là void *
) tới bộ nhớ được phân bổ và khi gán, được thay đổi thành kiểu đích. Không thể tính số không khớp ở kích thước mục tiêu (loại) với kích thước bộ nhớ được phân bổ.
cách thuận tiện nhất và đơn giản nhất để tránh những loại sai lầm là, không sử dụng các loại mã hóa cứng trực tiếp như các toán hạng của sizeof
, đúng hơn, sử dụng tài liệu tham khảo khác nhau.
Something như
struct buf_stats *bs = malloc(sizeof *bs) ; // you can write that as (sizeof (*bs)) also
// sizeof *bs === sizeof (struct buf_stats)
tương đương với
struct buf_stats *bs = malloc(sizeof(struct buf_stats)) ;
nhưng là mạnh mẽ hơn và ít dễ bị lỗi.
Ghi chú:
- Bạn không cần ngoặc nếu toán hạng không phải là một tên loại.
- Tuyên bố này không cần bất kỳ sửa đổi nào khi thay đổi loại biến mục tiêu
bs
.
Nguồn
2017-09-05 07:49:17
Heh? Thông báo lỗi bạn nhận được là gì? –
@SouravGhosh Tôi nghĩ rằng KHÔNG có thông báo lỗi và đó là những gì OP đang hỏi về. – Yunnosch
Dou muốn malloc đủ không gian cho một con trỏ? Trình biên dịch không thực sự cần kích thước của những gì nó trỏ đến cho điều đó. Hoặc bạn có muốn malloc cho một cấu trúc? Trong trường hợp đó, có một lỗi đánh máy khác, thứ hai '*'. – Yunnosch