因为项目需要,又一次捡起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");
}
然后,使用malloc函数在堆区分配了network_package类型大小的内存,并用上一行定义的指针指向它。
结构体中有三个一级指针与一个二级指针。
首先为一级指针在堆区分配32字节内存,用于存放字符串。
然后为二级指针在堆区分配16个字节内存,存放4个一级指针。为这4个一级指针在堆区每个分配32个字节的内存存放字符串。
因此二级指针指向的区域有4*4+32*4=144字节的堆区内存。相当于一个指针数组,该数组中有4个元素,每个元素代表一个指针,每个指针指向一块内存区域。
因此addr_array[i]代表每一个指针元素。
程序对addr_array[i]指向的字符串做了一个排序,输出结果: