您的位置:首页 > 其它

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

2016-03-16 13:57 281 查看
因为项目需要,又一次捡起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]指向的字符串做了一个排序,输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: