引用参数的类型转换问题

haggard 2018-12-09 11:01:59
先贴问题代码 main.cpp

#include <stdlib.h>

void myfree(void* &p)
{
free(p);
p = NULL;
}

int main()
{
void** a;
a = (void**)malloc(3 * sizeof(int));
myfree(a);
return 0;
}


指针a的类型改成void*,则没有任何问题。
如上面代码是void**类型时
GCC报错:
main.cpp(13,10): error : invalid initialization of reference of type ‘void*&’ from expression of type ‘void**’

改成myfree((void*)a);
main.cpp(13,17): error : invalid initialization of non-const reference of type ‘void*&’ from an rvalue of type ‘void*

再改成myfree((void*&)a);
main.cpp(13,17): warning : casting ‘void**’ to ‘void*&’ does not dereference pointer [enabled by default]

综上,我该怎么做? 最后的警告是啥意思,默认enable是指enable什么?
...全文
201 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
haggard 2018-12-10
  • 打赏
  • 举报
回复
没说二维啊,是指针数组,没用过吗? 这样吧,多写点
#include <iostream>
#include <stdlib.h>
using namespace std;
void myfree(void* &p)
{
    free(p);
    p = NULL;
}

int main()
{
    void** a;
    int i = 7;
    int &j = i;
    a = (void**)malloc(2 * sizeof(void*));
    a[0] = &i;
    a[1] = &j;
    cout << "i addr:" << a[0] << "\tj addr:" << a[1] << endl;
    myfree((void*&)a);
    return 0;
}
_ZGq 2018-12-10
  • 打赏
  • 举报
回复
一开始的代码是3*sizeof(int),这不是一个普通的一维数组吗?
现在15行是void*那当然是指针数组了
_ZGq 2018-12-09
  • 打赏
  • 举报
回复
a应该要用void*类型。a只是一个一维数组,并不是一个二维数组,只有二维数组和指向一维数组的指针才用void**
haggard 2018-12-09
  • 打赏
  • 举报
回复
引用 1 楼 weixin_41461277 的回复:
void*能转换成void**吗?这是不同级别的指针。 malloc(3 * sizeof(int))只是返回了第一个元素的地址,用void*就可以了
变量a要的就是指针的动态数组。malloc给它申请内存。然后myfree是把free和置NULL封装到一个通用函数,以替代原始free,以免遗漏置NULL变成野指针
_ZGq 2018-12-09
  • 打赏
  • 举报
回复
void*能转换成void**吗?这是不同级别的指针。
malloc(3 * sizeof(int))只是返回了第一个元素的地址,用void*就可以了

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧