【问题标题】:Get string from variable argument function从可变参数函数中获取字符串
【发布时间】:2020-02-05 20:54:58
【问题描述】:

我正在尝试将双指针传递给变量参数函数,以便我可以在其中存储一个字符串(在我的示例中为“hello world”),然后从我的主函数中打印它,但它不起作用。

#include <stdio.h>
#include <stdarg.h>

void get_value(const char *str,...) {

   va_list valist;

   /* initialize valist for num number of arguments */
   va_start(valist, str);

   /* access all the arguments assigned to valist */
    void *p;
    p = va_arg(valist, void*);

    char *tmp = strdup("hello world");
    *(const char**)p = tmp;

   /* clean memory reserved for valist */
   va_end(valist);

}

int main() {
    const char *t;
    get_value("first", &t);
    printf("%s\n", t);
}

我尝试关注 lib sd-bus 的实现,因为它在那里被大量使用,但到目前为止我还没有能够解决这个问题。

我的目标是使用它来模拟我的单元测试的 sd 总线方法。

【问题讨论】:

  • Not working 确实不是对问题所在的技术解释。程序员应该能够做得比这更好。

标签: c pointers dbus


【解决方案1】:

您缺少#include

您拥有的所有 include 都不包含 strdup 的声明。因此,编译器使用返回int 的函数的隐式函数声明。指针和int 在您的系统上很可能是不同的大小。隐式声明与真实声明不匹配导致undefined behavior

strdup 函数要求您 #include &lt;string.h&gt; 进行正确声明。

另外,因为您知道get_value 的参数是const char ** 类型,所以您应该将其传递给va_arg 而不是void *,并更改p 的类型以匹配。

【讨论】:

  • 很好,这是一个非常狡猾的错误,如果 OP 没有在顶部包含 #include 语句,可能会被忽略。
  • 谢谢...我在手机上使用那些在线 C 编译器,他们没有显示 strdup 警告部分...现在可以使用
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 2018-02-13
  • 2010-10-17
相关资源
最近更新 更多