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 ", (int)(sizeof(struct package) + p->msg_len)); 41 printf("message:%s", p->msg); 42 }
零长数组一般被放置在一个结构体的末尾,作为扩
展内存大小的占位符而存在的,这是数组唯一可以“越界”访问的场合 。 用在封装数据包的场合(因为数据包大小是不确定的)
在不同的客户机之间发送一些信息,这些信息
包括一些固定长度的数据,比如客户机的 IP 地址、主机名等,还包含一些长度不确定的数
据,比如用户自定义的文本或者文件
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 ", (int)(sizeof(struct package) + p->msg_len)); 41 printf("message:%s", p->msg); 42 }