柔性数组。
柔性数组是定义在结构体之上的数组。其中定义的柔性数组必须放在结构体的最末尾,结构体中至少有两个成员变量。
#include <stdio.h>
#include <stdlib.h>
typedef struct soft
{
int a;
int p[];
}S,*S_p;//柔性数组,*p没有占用空间。使用sizeof计算结构体空间的大小的时候,只是计算了成员a的大小。
int main(void)
{
int len = 0;
int i = 0;
printf("Enter the array length.\n");
scanf("%d",&len);
S *p = (S*)malloc(sizeof(S) + sizeof(int)*len);
p->a = len;
for (i=0; i<p->a; i++)
{
p->p[i] = i;
}
for (i=0; i<p->a; i++)
{
printf("p->p[%d] = %d.\n", i, p->p[i]);
}
free(p);
return 0;
}
网络结构体
因为现在主流的网络协议还是IPV4协议,所以使用IPV4协议。将本地ip地址转换成网络字节序地址。
/*
/* Internet address. */
typedef uint32_t in_addr_t;
typedef uint16_t in_port_t; // 16的无符号short类型
struct in_addr
{
in_addr_t s_addr;
};
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);/* AF_INET IPv4 Internet protocols 指定网络地址类型*/
in_port_t sin_port; /* Port number. 端口号 16位无符号short */
struct in_addr sin_addr;/* Internet address. 具体的网址32位无符号int*/
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
*/
#include <stdio.h>
#include <stdlib.h>
include <features.h>
#include <stdint.h>
#include <sys/socket.h>
#include <bits/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 0x1234
#define ADDR 192.168.2.11
int main(void)
{
//1、struct sockaddr_in定义这种类型的结构体变量
struct sockaddr_in s;
//2、填充你这个结构体各成员
s.sin_family = AF_INET;
// s.sin_ = AF_INET; (错误)
//但是已经错了,你的发送数据包,肯定找不到对方。
//传送过去的IP/PORT都是网络字节序,大端模式:低位(字节)要放到高地址。
s.sin_port = htons(PORT);
// printf("s.sin_port = 0x%x.\n", s.sin_port);
s.sin_addr.s_addr = inet_addr(ADDR);
//0x16011013
// printf("网络字节序地址:0x%x.\n", s.sin_addr.s_addr);
return 0;
}