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]指向的字符串做了一个排序,输出结果:
本文就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]指向的字符串做了一个排序,输出结果:
相关文章推荐
- 用正则表达式来判断是否有需要的字符串
- centos 6.5 安装docker
- 监听android home键的实现方式
- shell脚本获取日期的格式
- Oracle权限管理
- MySQL集群搭建详解
- SYN1621型 定位定向授时设备
- centos 6.5 安装docker
- 立体匹配:关于Middlebury提供的源码的简化后的结构
- gulp顺序执行任务
- sql语句的优化分析
- 状态同步与帧同步
- 你可能不知道的字符比较中的“秘密”
- 数组复制
- EL表达式截取字符串
- SYN1618型 高精度天文时间同步系统
- 多线程同步标记
- mode(思维,注意内存)
- uva 11151 Longest Palindrome
- Block的引用循环问题 (ARC & non-ARC)