&(void *){ NULL } 是什么意思

逃逃VS海 2015-11-06 11:07:16
在研究 ffmpeg中遇到一个函数
void av_freep(void *arg)
{
void *val;
memcpy(&val, arg, sizeof(val));
memcpy(arg, &(void *){ NULL }, sizeof(val)); // 这个语句在gcc编译中能编译,而我在VS中却无法编译提示错误
av_free(val);
}

// 然后我用 memcpy(arg, NULL, sizeof(val)); 来代替, 结果gcc编译出来的ffmpeg库 却运行出错, 显然说明 不能这么替代,
请问高手, 如何在VS中替代memcpy(arg, &(void *){ NULL }, sizeof(val));这句语句的实现
...全文
444 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
逃逃VS海 2015-11-06
  • 打赏
  • 举报
回复
谢谢各位, 我找到了替换语法 void av_freep(void *arg) { void *val = NULL; memcpy(&val, arg, sizeof(val)); memset(arg, 0, sizeof(val)); // 替换 memcpy(arg, &(void *){ NULL }, sizeof(val)); av_free(val); }
Saleayas 2015-11-06
  • 打赏
  • 举报
回复
void *pNULL = NULL; memcpy(arg, &pNULL, sizeof(val));
iyomumx 2015-11-06
  • 打赏
  • 举报
回复
compound literals C99的语法,注意msvc不支持C99,今后也很可能不会支持
fefe82 2015-11-06
  • 打赏
  • 举报
回复
(void *){ NULL } 是 C99 的 compound literal VS 不支持。 6.5.2.5 Compound literals 4 A postfix expression that consists of a parenthesized type name followed by a brace-enclosed list of initializers is a compound literal. It provides an unnamed object whose value is given by the initializer list. &(void *){ NULL } 是取它的地址。
逃逃VS海 2015-11-06
  • 打赏
  • 举报
回复
MINGW32 gcc 编译: void *p = &(void *){ NULL }; // 能编译通过 VS Studio 编译: void *p = &(void *){ NULL }; // 不能编译通过
paschen 2015-11-06
  • 打赏
  • 举报
回复
没这种语法。。
jiht594 2015-11-06
  • 打赏
  • 举报
回复
看看arg里面是什么货

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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