【C 语言】二级指针作为输出 ( 指针输入 您所在的位置:网站首页 判断ab大小的C语言代码 【C 语言】二级指针作为输出 ( 指针输入

【C 语言】二级指针作为输出 ( 指针输入

2023-04-24 20:48| 来源: 网络整理| 查看: 265

文章目录一、二级指针二、完整代码示例一、二级指针

指针 作为 函数输入 : 调用者 负责 分配内存 ;

指针 作为 函数输出 : 函数 负责 分配内存 , 一般 传入二级指针 , 函数负责生成内存 , 并 使用 二级指针 指向 一级指针, 一级指针 指向 在 函数中 分配好内存 ;

如果要在 函数中 分配内存 , 则 需要 传入二级指针 , 在函数内部调用 malloc 函数 , 分配内存 , 返回一个 一级指针 变量 ;

令 二级指针 形参 指向 该 一级指针变量 , 即可通过间接赋值 返回相关结果 ;

代码示例如下 :

/* * 生成 2 个字符串, 然后返回 */ int get_str(char **str1, int *len1, char **str2, int *len2) { char *s1 = NULL; char *s2 = NULL; // I . 生成第一个字符串 s1 = (char *)malloc(64); // 判断内存分配是否成功 if(s1 == NULL) { return -1; } // 向内存空间写入值 strcpy(s1, "abcd"); // 计算字符串大小 *len1 = strlen(s1); // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针 *str1 = s1; // II . 生成第一个字符串 s2 = (char *)malloc(64); // 判断内存分配是否成功 if(s2 == NULL) { return -2; } // 向内存空间写入值 strcpy(s2, "1234"); // 计算字符串大小 *len2 = strlen(s2); // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针 *str2 = s2; return 0; }

二级指针 最终 指向的内存释放 : 释放二级指针 指向的 一级指针 指向的内存的地址 , 释放后 将指针指向的地址置空 ;

/* * 释放字符串内存 */ int free_str(char **str) { // 判断传入的二级指针是否合法 if(str == NULL) { return -1; } // 释放二级指针 指向的 一级指针 指向的内存的地址 // 释放指针 free(*str); // 将指针指向的地址置空 *str = NULL; return 0; }

一级指针 指向的内存释放 : 释放一级指针 指向的内存的地址 , 释放后 无法 将指针指向的地址置空 ;

/* * 释放字符串内存 * 传入 一级指针 , 只能释放一级指针指向的内存 * 不能 讲一级指针 置空 */ int free_str2(char *str) { // 判断传入的二级指针是否合法 if(str == NULL) { return -1; } // 释放一级指针 free(str); return 0; }二、完整代码示例

完整代码示例 :

#include #include #include /* * 生成 2 个字符串, 然后返回 */ int get_str(char **str1, int *len1, char **str2, int *len2) { char *s1 = NULL; char *s2 = NULL; // I . 生成第一个字符串 s1 = (char *)malloc(64); // 判断内存分配是否成功 if(s1 == NULL) { return -1; } // 向内存空间写入值 strcpy(s1, "abcd"); // 计算字符串大小 *len1 = strlen(s1); // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针 *str1 = s1; // II . 生成第一个字符串 s2 = (char *)malloc(64); // 判断内存分配是否成功 if(s2 == NULL) { return -2; } // 向内存空间写入值 strcpy(s2, "1234"); // 计算字符串大小 *len2 = strlen(s2); // 将生成的字符串 , 通过二级指针 间接赋值 给 一级指针 *str2 = s2; return 0; } /* * 释放字符串内存 */ int free_str(char **str) { // 判断传入的二级指针是否合法 if(str == NULL) { return -1; } // 释放二级指针 指向的 一级指针 指向的内存的地址 // 释放指针 free(*str); // 将指针指向的地址置空 *str = NULL; return 0; } /* * 释放字符串内存 * 传入 一级指针 , 只能释放一级指针指向的内存 * 不能 讲一级指针 置空 */ int free_str2(char *str) { // 判断传入的二级指针是否合法 if(str == NULL) { return -1; } // 释放一级指针 free(str); return 0; } int main() { // 第一个字符串 char *str1 = NULL; // 第一个字符串字符个数 int len1 = 0; // 第二个字符串 char *str2 = NULL; // 第二个字符串字符个数 int len2 = 0; // 函数调用的返回值 int ret = 0; // 调用函数 , 传入二级指针 ret = get_str(&str1, &len1, &str2, &len2); // 打印函数中生成的字符串 printf("str1 = %s, str2 = %s\n", str1, str2); // 释放字符串指针指向的内存 , 传入二级指针 free_str(&str1); // 释放字符串指针指向的内存 , 传入一级指针 free_str2(str2); // 命令行不要退出 system("pause"); return 0; }

执行结果 :



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有