【问题标题】:function with ellipsis resulting in segfault带有省略号的函数导致段错误
【发布时间】:2013-04-12 15:50:23
【问题描述】:

我有以下导致段错误的代码

    #define MAPGW_CM_TRACE(...) mapgw_cm_trace(__VA_ARGS__)

函数定义是这样的..

    int mapgw_cm_trace(int trapLog, char *pcMsgId, ...)
   { //do something

    }

我这样调用函数..:

    MAPGW_CM_TRACE(1,"<some String>", 
                23,233, 4783274, 2138123, 23123, 21312,23112); 

我知道我可能对省略号的了解较少。请帮我解决。
提前谢谢..

【问题讨论】:

  • 你试过调试它吗?它在哪一行失败?
  • 请提供一个最小的、可编译的测试用例,以便我们可以在我们的系统上重现您的问题。
  • 调试.. 是的.. 正是在这个函数调用中,它失败并抛出了 segfault 错误..

标签: c segmentation-fault ellipsis


【解决方案1】:

我无法准确猜出崩溃的原因。

但是改用下面的宏定义

#define MAPGW_CM_TRACE(TRAP,MSGID,args...) mapgw_cm_trace(TRAP,MSGID,##args);

看看它是否修复了崩溃

【讨论】:

    【解决方案2】:

    什么是pcMsgId,它是一个格式字符串,在这种情况下,每个数字(%d,%u,%ld或%lu)都需要一个匹配的%,如果pcMsgId不是格式字符串,那么如何mapgw_cm_trace 函数是否知道参数何时结束,对于指针数组,它通常是尾随 NULL,对于其他类型,通常有一个 count 参数。通常情况下,如果 pcMsgId 不是格式字符串,则以下参数都与 pcMsgId 属于同一类型。基本上pcMsgId后面的参数数量是如何确定的。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多