C语言中二级指针输出模型主要目的在于使用被调函数中分配的内存
在主函数中定义一级指针,子函数输入参数定义为二级指针,则传递至子函数的参数为一级指针的地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct network_package{
int num;
char *local_addr;
char *dest_addr;
char **addr_array;
}network_package;
int network_package_allocate(network_package **p)
{
int i;
network_package *tmp;
tmp = NULL;
tmp = (network_package *)malloc(sizeof(network_package));
if (tmp == NULL){
return -1;
}
tmp->local_addr = (char *)malloc(32 * sizeof(char));
if (tmp->local_addr == NULL){
return -1;
}
tmp->dest_addr = (char *)malloc(32 * sizeof(char));
if (tmp->dest_addr == NULL){
return -1;
}
tmp->addr_array = (char **)malloc(4 * sizeof(char *));
if (tmp->addr_array == NULL){
return -1;
}
for (i = 0; i < 4; i++){
tmp->addr_array[i] = (char *)malloc(32 * sizeof(char));
if (tmp->addr_array[i] == NULL){
return -1;
}
}
*p = tmp;
printf("tmp:%d\n", tmp);
return 1;
}
int print_package(network_package *p)
{
int i;
printf("Local_addr: %s\n", p->local_addr);
printf("Dest_addr: %s\n", p->dest_addr);
for (i = 0; i < 4; i++){
printf("Array[%d]_addr: %s\n", i, p->addr_array[i]);
}
return 1;
}
void main()
{
network_package *pkg_tx;
pkg_tx = NULL;
if (network_package_allocate(&pkg_tx)){
printf("pkg_tx: %d\n", pkg_tx);
strcpy_s(pkg_tx->local_addr, 32, "192.168.5.10");
strcpy_s(pkg_tx->dest_addr, 32, "192.168.5.20");
strcpy_s(pkg_tx->addr_array[0], 32, "192.168.5.30");
strcpy_s(pkg_tx->addr_array[1], 32, "192.168.5.31");
strcpy_s(pkg_tx->addr_array[2], 32, "192.168.5.32");
strcpy_s(pkg_tx->addr_array[3], 32, "192.168.5.33");
}
print_package(pkg_tx);
system("pause");
}
执行结果:
查看子函数中tmp指针指向的内存首地址为7570944,主函数调用子函数后,pkg_tx指针指向的内存首地址也为7570944。
成功的将子函数分配的内存引入了主函数,并可进行赋值等一系列操作。