Bạn cần quyết định bạn đang cố gắng làm gì trước tiên.
Nếu bạn muốn có một cấu trúc với một con trỏ đến một [độc lập] mảng bên trong, bạn phải khai báo nó như
struct my_struct {
int n;
char *s;
};
Trong trường hợp này bạn có thể tạo ra các đối tượng struct thực tế trong bất kỳ cách bạn hài lòng (như một biến tự động, ví dụ)
struct my_struct ms;
và sau đó phân bổ bộ nhớ cho mảng độc lập
ms.s = malloc(50 * sizeof *ms.s);
Trong thực tế, không có nhu cầu chung để phân bổ bộ nhớ mảng động
struct my_struct ms;
char s[50];
ms.s = s;
Tất cả phụ thuộc vào loại đời bạn cần từ các đối tượng này. Nếu cấu trúc của bạn là tự động, thì trong hầu hết các trường hợp mảng cũng sẽ tự động. Nếu đối tượng struct sở hữu bộ nhớ mảng, đơn giản là không có điểm nào khi thực hiện khác. Nếu bản thân cấu trúc là động, thì mảng cũng thường là động.
Lưu ý rằng trong trường hợp này, bạn có hai khối bộ nhớ độc lập: cấu trúc và mảng.
Cách tiếp cận hoàn toàn khác sẽ là sử dụng thành ngữ "struct hack". Trong trường hợp này mảng trở thành một phần không tách rời của cấu trúc. Cả hai đều nằm trong một khối bộ nhớ. Trong C99 struct sẽ được khai báo là
struct my_struct {
int n;
char s[];
};
và để tạo ra một đối tượng bạn phải phân bổ toàn bộ điều động
struct my_struct *ms = malloc(sizeof *ms + 50 * sizeof *ms->s);
Kích thước của khối bộ nhớ trong trường hợp này được tính toán để thích ứng với cấu trúc thành viên và mảng đuôi của kích thước thời gian chạy.
Lưu ý rằng trong trường hợp này bạn không có tùy chọn để tạo các đối tượng struct như đối tượng tĩnh hoặc tự động. Các cấu trúc với các thành viên mảng linh hoạt ở cuối chỉ có thể được phân bổ động trong C.
Giả định của bạn về aritmetics nhanh hơn là mảng hoàn toàn không chính xác. Mảng hoạt động thông qua con trỏ arithmetics theo định nghĩa, vì vậy về cơ bản chúng giống nhau. Hơn nữa, một mảng chính hãng (không bị phân rã thành con trỏ) thường nhanh hơn một chút so với đối tượng con trỏ. Giá trị con trỏ phải được đọc từ bộ nhớ, trong khi vị trí của mảng trong bộ nhớ là "đã biết" (hoặc "được tính toán") từ chính đối tượng mảng đó.
'char s []' giống với 'char * s' chỉ bên trong danh sách tham số của hàm. –