使用二级指针传出参数

使用指针传出参数时,要注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。

定义一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间;

要指向堆上或此函数外的内存空间。


1. 参数传递的原则是:形参传给实参,不能反向传递;

2. 一级指针可以在函数内部修改实参指针指向的内容;

如: 

void f(char *p) 

{p[2] = a;
//由实参指向的函数外部的数组的内容就被改变了。……
}
如果我们想改变实参本身呢?也就是说,我们连指针值都要改变,如果使用:

void f(char *p) 
{	
    p = (char *)malloc(10 * sizeof(char))	
    //或C++中:p = new char[10];	
……}
就不行了,因为在函数内部不能通过改变形参的值来改变实参。

但是,可以通过二级指针来改变指针值。


void f(char **p)
{    
    *p = new char[10];
    *p[2] = a;
    delete char[];
……}


可以这样说,传入一个N级指针,就可以修改N-1级指针,原因还是C的参数传递是值传递的,直接修改形参根本改变不了实参,

但可以改变形参指针指向的内容,而N级指针指向的内容就是一个N-1级指针。



注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。

你定义了一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数栈中的内存会被释放掉,

不要让指针指向此函数栈中的内存空间,要指向堆上或此函数外的内存空间。



代码范例:

#include <stdio.h>
#include <string.h>
char *f_void(void);
void f_2ptr(char **ret);
void f_1ptr(char *ret);
 
 
int main()
{
    char havec[] = "this is a b c d e f";
    char **ret; // Alloc memory for secondary pointer
    char *tmp;  // Alloc memory for first pointer
 
    ret = &tmp; // this is imporint, why?
    f_2ptr(ret);
    printf("%s\n",tmp); // Ok
    tmp = f_void();
    printf("%s\n",tmp); // Ok
 
    f_1ptr(havec);
    printf("havec = %s\n",havec);
 
    return 0;
}
 
void f_2ptr(char **ret) // output argument, memory is alloced in the function
{
    static char aa[] = "this is output argument";  // 该处的static指定数组aa[]指向全局变量所在空间
    *ret = aa;
}
 
void f_1ptr(char *ret) // memory is alloced outside the function
{
    char *tmp;
    if((tmp = index(ret,'c')) ==NULL) // this is just a example
        return ;
    *(tmp+4) = '\0';
}
 
 
char *f_void(void) // return a pointer, memory is alloced in global
{
    return "this is return value";
}




运行结果:

root@startech-945GCM-S2C:~/Cisco-MAPI-Test# ./ok
this is output argument
this is return value
havec = this is a b c d
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
精易模块V7.6.5 what's new:(20191001) 一、新增 1、新增“剪贴板_监听”,把指定的窗口句柄加入到剪贴板查看器链中; 2、新增“剪贴板_停止监听”,从剪贴板查看器链中删除指定的窗口句柄; 3、新增“进度条_滚动”,设置成功返回1,失败返回0。需要使用Windows通用组件库。感谢【@aqwvwv 】提供; 4、新增“时间_判断二十四节气”,判断日期范围为1901年1月1日—2099年12月31日以内的指定日期是否为节气日,是返回节气名称,不是返回空;感谢【@yhywhh123 】提供; 5、新增“系统_重启资源管理器”,成功重启资源管理器; 6、新增“外部组合框_取结构信息”,成功返回组合框的结构信息; 7、新增“进程_终止进程”,一个或多个任务进程结束; 8、新增“窗口_端口取PID”,通过本地端口取出进程PID;感谢【@DeHby 】提供; 9、新增“窗口_注册窗口热键”,注册窗口级热键,只有在窗口被激活时才有效; 10、新增“窗口_撤销窗口热键”,撤销窗口级热键; 二、修复 1、修复“时间_取北京时间”“时间_同步校时”多了八个小时,原因是“时间_GMT转为时间”已有处理东八区该加上的八个小时; 2、修复“文本_是否为汉字2”,返回值错误的问题!感谢【@linqing4 】反馈问题; 3、修复“系统_生成随机mac”,没判断16进制中第一组第二个数字必须是偶数;感谢【@韦贝贝 】反馈建议; 4、修复“类_配置项ex - 读”,传参的默认文本不做解密处理; 5、修复“网页_Cookie合并更新”,当Cookie值有空格时返回却没有空格的问题;感谢【@默念、 】反馈问题; 6、修复“网页_访问_对象”代理方法的问题;感谢【@wg521125 】反馈问题; 7、修复“普通填表 - 组合框_操作”,枚举对象的问题; 8、修复“文本_取全部汉字拼音”,保留非汉字为真时欲转换的文本结尾不为汉字返回少一个字符的问题;感谢【@寒潮 】反馈问题; 三、优化 1、优化“类_json - 置属性”,不为对象时自动转义反斜杠和引号以及换行符,同时支持数字名字的赋值,需要加声明; 2、优化“类_日志输出 - 文件路径”,当文件句柄大于0时执行关闭文件命令;感谢【@shituo 】反馈建议; 3、优化“外部组合框_置现行选中项”,增加通知父窗选择了组合框中的一项; 4、优化“键盘_键名取键代码”,增加取Tab键键值;感谢【@y10455 】反馈问题; 5、优化“键盘_键代码取键名”,增加Tab键值取键名; 四、移除 1、移除“PathAddBackslashA”,滥用此功能可能导致缓冲区溢出; 2、移除“SendMessageA_Rect”、“SendMessageA_逻辑”、“SendMessageA_文本”、“SendMessageA_整数”,统一使用“SendMessageA”; 3、移除“CallWindowProcA_指针”,统一使用“CallWindowProcA”; 4、移除“lstrlenA_文本”、“lstrlenA_整数”,统一使用“lstrlenA”; 5、移除“PostMessageA_str”,统一使用“PostMessageA”; 6、移除“send_文本”、“send_整数”、“send_字节集”,统一使用“send”; 7、移除“SetClassLongA1”,统一使用“SetClassLongA”; 8、移除“SetWindowLongA_指针”、“SetWindowLongA_子程序指针”,统一使用“SetWindowLongA”; 9、移除“WideCharToMultiByte_整数”、“WideCharToMultiByte_字节集”,统一使用“WideCharToMultiByte”; 10、移除“HttpSendRequestA_字节集”,统一使用“HttpSendRequestA”; 11、移除“FindWindowExA_文本”,“FindWindowExA_整数”,统一使用“FindWindowExA”; 12、移除“文本_取地址”、“取变量数据地址_文本”,统一使用“取指针文本_”; 13、移除“变量_取数据指针”,统一使用“取数据_通用型”; 14、移除“指针_到整数型_汇编”,统一使用“指针_到整数”; 15、移除“取整数型引用”、“取整数型指针”,统一使用“取指针整数_”; 16、移除“取指针地址_通用”,统一使用“取指针_通用型”; 17、移除“取指针地址_数组通用”,统一使用“取指针_通用型_数组”; 18、移除“取变量数据地址_字节集”,统一使用“取指针字节集_”; 精易模块V7.6.0 what's new:(20190902) 一、新增 1、新增“文本_
精易模块V7.6.5 what's new:(20191001) 一、新增 1、新增“剪贴板_监听”,把指定的窗口句柄加入到剪贴板查看器链中; 2、新增“剪贴板_停止监听”,从剪贴板查看器链中删除指定的窗口句柄; 3、新增“进度条_滚动”,设置成功返回1,失败返回0。需要使用Windows通用组件库。感谢【@aqwvwv 】提供; 4、新增“时间_判断二十四节气”,判断日期范围为1901年1月1日—2099年12月31日以内的指定日期是否为节气日,是返回节气名称,不是返回空;感谢【@yhywhh123 】提供; 5、新增“系统_重启资源管理器”,成功重启资源管理器; 6、新增“外部组合框_取结构信息”,成功返回组合框的结构信息; 7、新增“进程_终止进程”,一个或多个任务进程结束; 8、新增“窗口_端口取PID”,通过本地端口取出进程PID;感谢【@DeHby 】提供; 9、新增“窗口_注册窗口热键”,注册窗口级热键,只有在窗口被激活时才有效; 10、新增“窗口_撤销窗口热键”,撤销窗口级热键; 二、修复 1、修复“时间_取北京时间”“时间_同步校时”多了八个小时,原因是“时间_GMT转为时间”已有处理东八区该加上的八个小时; 2、修复“文本_是否为汉字2”,返回值错误的问题!感谢【@linqing4 】反馈问题; 3、修复“系统_生成随机mac”,没判断16进制中第一组第二个数字必须是偶数;感谢【@韦贝贝 】反馈建议; 4、修复“类_配置项ex - 读”,传参的默认文本不做解密处理; 5、修复“网页_Cookie合并更新”,当Cookie值有空格时返回却没有空格的问题;感谢【@默念、 】反馈问题; 6、修复“网页_访问_对象”代理方法的问题;感谢【@wg521125 】反馈问题; 7、修复“普通填表 - 组合框_操作”,枚举对象的问题; 8、修复“文本_取全部汉字拼音”,保留非汉字为真时欲转换的文本结尾不为汉字返回少一个字符的问题;感谢【@寒潮 】反馈问题; 三、优化 1、优化“类_json - 置属性”,不为对象时自动转义反斜杠和引号以及换行符,同时支持数字名字的赋值,需要加声明; 2、优化“类_日志输出 - 文件路径”,当文件句柄大于0时执行关闭文件命令;感谢【@shituo 】反馈建议; 3、优化“外部组合框_置现行选中项”,增加通知父窗选择了组合框中的一项; 4、优化“键盘_键名取键代码”,增加取Tab键键值;感谢【@y10455 】反馈问题; 5、优化“键盘_键代码取键名”,增加Tab键值取键名; 四、移除 1、移除“PathAddBackslashA”,滥用此功能可能导致缓冲区溢出; 2、移除“SendMessageA_Rect”、“SendMessageA_逻辑”、“SendMessageA_文本”、“SendMessageA_整数”,统一使用“SendMessageA”; 3、移除“CallWindowProcA_指针”,统一使用“CallWindowProcA”; 4、移除“lstrlenA_文本”、“lstrlenA_整数”,统一使用“lstrlenA”; 5、移除“PostMessageA_str”,统一使用“PostMessageA”; 6、移除“send_文本”、“send_整数”、“send_字节集”,统一使用“send”; 7、移除“SetClassLongA1”,统一使用“SetClassLongA”; 8、移除“SetWindowLongA_指针”、“SetWindowLongA_子程序指针”,统一使用“SetWindowLongA”; 9、移除“WideCharToMultiByte_整数”、“WideCharToMultiByte_字节集”,统一使用“WideCharToMultiByte”; 10、移除“HttpSendRequestA_字节集”,统一使用“HttpSendRequestA”; 11、移除“FindWindowExA_文本”,“FindWindowExA_整数”,统一使用“FindWindowExA”; 12、移除“文本_取地址”、“取变量数据地址_文本”,统一使用“取指针文本_”; 13、移除“变量_取数据指针”,统一使用“取数据_通用型”; 14、移除“指针_到整数型_汇编”,统一使用“指针_到整数”; 15、移除“取整数型引用”、“取整数型指针”,统一使用“取指针整数_”; 16、移除“取指针地址_通用”,统一使用“取指针_通用型”; 17、移除“取指针地址_数组通用”,统一使用“取指针_通用型_数组”; 18、移除“取变量数据地址_字节集”,统一使用“取指针字节集_”;
一、新增 1、新增“剪贴板_监听”,把指定的窗口句柄加入到剪贴板查看器链中; 2、新增“剪贴板_停止监听”,从剪贴板查看器链中删除指定的窗口句柄; 3、新增“进度条_滚动”,设置成功返回1,失败返回0。需要使用Windows通用组件库。感谢【 @aqwvwv  】提供; 4、新增“时间_判断二十四节气”,判断日期范围为1901年1月1日—2099年12月31日以内的指定日期是否为节气日,是返回节气名称,不是返回空;感谢【 @yhywhh123  】提供; 5、新增“系统_重启资源管理器”,成功重启资源管理器; 6、新增“外部组合框_取结构信息”,成功返回组合框的结构信息; 7、新增“进程_终止进程”,一个或多个任务进程结束; 8、新增“窗口_端口取PID”,通过本地端口取出进程PID;感谢【 @DeHby  】提供; 9、新增“窗口_注册窗口热键”,注册窗口级热键,只有在窗口被激活时才有效; 10、新增“窗口_撤销窗口热键”,撤销窗口级热键; 二、修复 1、修复“时间_取北京时间”“时间_同步校时”多了八个小时,原因是“时间_GMT转为时间”已有处理东八区该加上的八个小时; 2、修复“文本_是否为汉字2”,返回值错误的问题!感谢【 @linqing4  】反馈问题; 3、修复“系统_生成随机mac”,没判断16进制中第一组第二个数字必须是偶数;感谢【 @韦贝贝  】反馈建议; 4、修复“类_配置项ex - 读”,传参的默认文本不做解密处理; 5、修复“网页_Cookie合并更新”,当Cookie值有空格时返回却没有空格的问题;感谢【 @默念、  】反馈问题; 6、修复“网页_访问_对象”代理方法的问题;感谢【 @wg521125  】反馈问题; 7、修复“普通填表 - 组合框_操作”,枚举对象的问题; 8、修复“文本_取全部汉字拼音”,保留非汉字为真时欲转换的文本结尾不为汉字返回少一个字符的问题;感谢【 @寒潮  】反馈问题; 三、优化 1、优化“类_json - 置属性”,不为对象时自动转义反斜杠和引号以及换行符,同时支持数字名字的赋值,需要加声明; 2、优化“类_日志输出 - 文件路径”,当文件句柄大于0时执行关闭文件命令;感谢【 @shituo  】反馈建议; 3、优化“外部组合框_置现行选中项”,增加通知父窗选择了组合框中的一项; 4、优化“键盘_键名取键代码”,增加取Tab键键值;感谢【 @y10455  】反馈问题; 5、优化“键盘_键代码取键名”,增加Tab键值取键名; 四、移除 1、移除“PathAddBackslashA”,滥用此功能可能导致缓冲区溢出; 2、移除“SendMessageA_Rect”、“SendMessageA_逻辑”、“SendMessageA_文本”、“SendMessageA_整数”,统一使用“SendMessageA”; 3、移除“CallWindowProcA_指针”,统一使用“CallWindowProcA”; 4、移除“lstrlenA_文本”、“lstrlenA_整数”,统一使用“lstrlenA”; 5、移除“PostMessageA_str”,统一使用“PostMessageA”; 6、移除“send_文本”、“send_整数”、“send_字节集”,统一使用“send”; 7、移除“SetClassLongA1”,统一使用“SetClassLongA”; 8、移除“SetWindowLongA_指针”、“SetWindowLongA_子程序指针”,统一使用“SetWindowLongA”; 9、移除“WideCharToMultiByte_整数”、“WideCharToMultiByte_字节集”,统一使用“WideCharToMultiByte”; 10、移除“HttpSendRequestA_字节集”,统一使用“HttpSendRequestA”; 11、移除“FindWindowExA_文本”,“FindWindowExA_整数”,统一使用“FindWindowExA”; 12、移除“文本_取地址”、“取变量数据地址_文本”,统一使用“取指针文本_”; 13、移除“变量_取数据指针”,统一使用“取数据_通用型”; 14、移除“指针_到整数型_汇编”,统一使用“指针_到整数”; 15、移除“取整数型引用”、“取整数型指针”,统一使用“取指针整数_”; 16、移除“取指针地址_通用”,统一使用“取指针_通用型”; 17、移除“取指针地址_数组通用”,统一使用“取指针_通用型_数组”; 18、移除“取变量数据地址_字节集”,统一使用“取指针字节集_”; 点此查看其它版本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值