C--struct中一级指针与二级指针练习

因为项目需要,又一次捡起C语言,发现了解的还是太少。

本文就struct结构体中的一级指针和二级指针的使用编写了一个小程序。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct network_package{
	int package_type;
	char *dest_addr;
	char *local_addr;
	char *sink_addr;
	char **addr_array;
}network_package;

void print_struct(network_package *pkg_tx)
{
	int i;
	printf("dest_addr: %s\n", pkg_tx->dest_addr);
	printf("local_addr: %s\n", pkg_tx->local_addr);
	printf("sink_addr: %s\n", pkg_tx->sink_addr);
	printf("\n");
	for (i = 0; i < 4; i++)
	{
		printf("addr_array[%d]: %s\n", i, pkg_tx->addr_array[i]);
	}
	printf("\n");
}

void sort_struct_array(char **addr_array)
{
	int i, j;
	char temp[32];
	for (i = 0; i < 4; i++)
	{
		for (j = i + 1; j < 4; j++)
		{
			if (strcmp(addr_array[i], addr_array[j]) < 0)
			{
				strcpy_s(temp, 32, addr_array[i]);
				strcpy_s(addr_array[i], 32, addr_array[j]);
				strcpy_s(addr_array[j], 32, temp);
			}
		}
	}
}

void free_struct(network_package *pkg_tx)
{
	int i;
	for (i = 0; i < 4; i++)
	{
		free(pkg_tx->addr_array[i]);
		pkg_tx->addr_array[i] = NULL;
	}

	free(pkg_tx->dest_addr);
	pkg_tx->dest_addr = NULL;
	free(pkg_tx->local_addr);
	pkg_tx->local_addr = NULL;
	free(pkg_tx->sink_addr);
	pkg_tx->sink_addr = NULL;
	free(pkg_tx->addr_array);
	pkg_tx->addr_array = NULL;

	free(pkg_tx);
	pkg_tx = NULL;
}

void main()
{
	int i;
	network_package *pkg_tx;
	pkg_tx = (network_package *)malloc(sizeof(network_package));

	pkg_tx->package_type = 0;
	pkg_tx->dest_addr = (char *)malloc(32 * sizeof(char));
	if (pkg_tx->dest_addr == NULL)
	{
		return;
	}
	pkg_tx->local_addr = (char *)malloc(32 * sizeof(char));
	if (pkg_tx->local_addr == NULL)
	{
		return;
	}
	pkg_tx->sink_addr = (char *)malloc(32 * sizeof(char));
	if (pkg_tx->sink_addr == NULL)
	{
		return;
	}
	pkg_tx->addr_array = (char **)malloc(4 * sizeof(char *));
	if (pkg_tx->addr_array == NULL)
	{
		return;
	}

	for (i = 0; i < 4; i++)
	{
		pkg_tx->addr_array[i] = (char *)malloc(32*sizeof(char));
		if (pkg_tx->addr_array[i] == NULL)
		{
			return;
		}
	}

	strcpy_s(pkg_tx->dest_addr, 32, "192.168.1.1");
	strcpy_s(pkg_tx->local_addr, 32, "192.168.1.2");
	strcpy_s(pkg_tx->sink_addr, 32, "192.168.1.3");

	strcpy_s(pkg_tx->addr_array[0], 32, "192.168.5.1");
	strcpy_s(pkg_tx->addr_array[1], 32, "192.168.5.2");
	strcpy_s(pkg_tx->addr_array[2], 32, "192.168.5.3");
	strcpy_s(pkg_tx->addr_array[3], 32, "192.168.5.4");

	print_struct(pkg_tx);

	sort_struct_array(pkg_tx->addr_array);

	print_struct(pkg_tx);

	free_struct(pkg_tx);

	system("pause");
}



程序首先定义了一个指向network_package类型的指针,在栈区分配4个字节内存存放它。

然后,使用malloc函数在堆区分配了network_package类型大小的内存,并用上一行定义的指针指向它。

结构体中有三个一级指针与一个二级指针。

首先为一级指针在堆区分配32字节内存,用于存放字符串。

然后为二级指针在堆区分配16个字节内存,存放4个一级指针。为这4个一级指针在堆区每个分配32个字节的内存存放字符串。

因此二级指针指向的区域有4*4+32*4=144字节的堆区内存。相当于一个指针数组,该数组中有4个元素,每个元素代表一个指针,每个指针指向一块内存区域。

因此addr_array[i]代表每一个指针元素。


程序对addr_array[i]指向的字符串做了一个排序,输出结果:



转载于:https://my.oschina.net/u/2510891/blog/669496

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值