1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <string.h> 5 #include <strings.h> 6 7 struct package //聲明數據包 8 { 9 int msg_len; 10 /* 11 * 12 *any other data 13 */ 14 char msg[0];//零長度數組(即柔性數組) 15 }; 16 17 void test_package(struct package *p); 18 19 int main(void) 20 { 21 char buffer[100]; 22 23 while(1) 24 { 25 fgets(buffer, 100, stdin);//將一些數據寫進buffer中 26 27 struct package *p = malloc(sizeof(struct package) + strlen(buffer) + 1); 28 29 p->msg_len = strlen(buffer) + 1; 30 strncpy(p->msg, buffer, p->msg_len); 31 32 test_package(p); 33 } 34 35 return 0; 36 } 37 38 void test_package(struct package *p) 39 { 40 printf("total len:%d\n", (int)(sizeof(struct package) + p->msg_len)); 41 printf("message:%s", p->msg); 42 }
零長數組通常被放置在一個結構體的末尾,做爲擴
展內存大小的佔位符而存在的,這是數組惟一能夠「越界」訪問的場合 。 用在封裝數據包的場合(由於數據包大小是不肯定的)數組
在不一樣的客戶機之間發送一些信息,這些信息
包括一些固定長度的數據,好比客戶機的 IP 地址、主機名等,還包含一些長度不肯定的數
據,好比用戶自定義的文本或者文件 spa
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <string.h> 5 #include <strings.h> 6 7 struct package //聲明數據包 8 { 9 int msg_len; 10 /* 11 * 12 *any other data 13 */ 14 char msg[0];//零長度數組(即柔性數組) 15 }; 16 17 void test_package(struct package *p); 18 19 int main(void) 20 { 21 char buffer[100]; 22 23 while(1) 24 { 25 fgets(buffer, 100, stdin);//將一些數據寫進buffer中 26 27 struct package *p = malloc(sizeof(struct package) + strlen(buffer) + 1); 28 29 p->msg_len = strlen(buffer) + 1; 30 strncpy(p->msg, buffer, p->msg_len); 31 32 test_package(p); 33 } 34 35 return 0; 36 } 37 38 void test_package(struct package *p) 39 { 40 printf("total len:%d\n", (int)(sizeof(struct package) + p->msg_len)); 41 printf("message:%s", p->msg); 42 }code