有关结构体的应用

柔性数组。

柔性数组是定义在结构体之上的数组。其中定义的柔性数组必须放在结构体的最末尾,结构体中至少有两个成员变量。

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值