Получить строку из функции аргумента переменной - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь передать двойной указатель на функцию переменного аргумента, чтобы я мог сохранить в ней строку (в моем примере «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 bus для моих юнит-тестов.

1 Ответ

1 голос
/ 06 февраля 2020

Вам не хватает #include.

Ни одно из включенных вами включений не включает объявление для strdup. Из-за этого компилятор использует неявное объявление функции функции, возвращающей int. Указатель и int, скорее всего, разных размеров в вашей системе. Несоответствие между неявным объявлением и действительным объявлением приводит к неопределенному поведению .

Функция strdup требует от вас #include <string.h> для правильного объявления.

Также поскольку вы знаете, что аргумент get_value имеет тип const char **, вы должны передать его в va_arg вместо void * и изменить тип p на соответствующий.

...