недопустимое использование пустого выражения в c printf - PullRequest
0 голосов
/ 28 февраля 2019

Я учусь в.У меня есть такая структура:

typedef struct mystuff
{
    char* name;
    int      val;
}MyStuff;

В основном я звоню:

MyStuff fruit1 ={"watermellon", 1};

Я передаю данные в insertLifo:

insertLifo(myQueue, &fruit1);

Это функция

bool insertLifo(LifoQueue queue, void* data)

Внутри функции я хочу напечатать данные для отладки:

printf("insertLifo()  %s \n", *data);

Я получаю следующую ошибку:

MemAlloc.c: In function ‘insertLifo’:
MemAlloc.c:42:32: warning: dereferencing ‘void *’ pointer [enabled by default]
  printf("insertLifo()  %s \n", *data);
                                ^
MemAlloc.c:42:2: error: invalid use of void expression
  printf("insertLifo()  %s \n", *data);
  ^

Я пытался:

printf("insertLifo()  %p \n", (void*)*data);

и другие способы.

Я хочу полностью понять, как использовать указатели

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Чтобы напечатать адрес указателя, вы используете оболочку %p формат printf вместо %s для строки.

Если вам нужна строка stringf, вы можете использоватьследующее:

MyStuff *stuff = (MyStuff*)data;
printf("insertLifo() data=%p = {name=%s, val=%d} \n", data, stuff->name, stuff->val);
0 голосов
/ 01 марта 2019

Ваша ошибка в том, как вы объявляете insertLifo(), так как вы неправильно объявляете второй параметр.Это должно быть:

bool insertLifo(LifoQueue queue, MyStuff* data)

, чтобы вы могли передать переменную по ссылке.Затем вы должны сделать:

printf("bla bla %s", data->name);

, поскольку спецификатор формата %s требует передать параметр типа char *, поскольку name есть.

Но, как ясказал вам в комментарии к вашему вопросу, нам нужен полный и проверяемый пример, чтобы иметь возможность сделать диагностику.Вы этого не делали, поэтому вы получаете неполные ответы.Пожалуйста, прочитайте Как создать минимальный, полный и проверяемый пример

Другая ошибка заключается в том, что, вероятно, вам потребуется передать также первый параметр insertLifo() по ссылке, так как вам нужновероятно, чтобы изменить эту структуру, и если вы передадите ее по значению, она будет скопирована в функцию, и любые изменения, которые вы сделаете с ней, будут потеряны при возврате функции.

Наконец, вы говорите

Я хочу полностью понять, как использовать указатели.

Ну, это полностью выходит за рамки этого приложения.StackOverflow предназначен только для того, чтобы помочь вам исправить небольшую проблему в вашем коде, но не для того, чтобы научить вас программировать.Я могу сказать, что многие люди проходят всю свою жизнь, пытаясь понять, как использовать указатели, и никогда не добиваются успеха.Это зависит от многих аспектов, но хорошо, что вы можете сделать, это купить хорошую книгу на C.

0 голосов
/ 28 февраля 2019

A void * - это общий указатель.Тип данных, на которые он указывает, неизвестен, поэтому вы не можете разыменовывать a void *.

. Вы должны изменить свою функцию так, чтобы она принимала MyStuff *, и измените вызов printf для печати каждого поля..

bool insertLifo(LifoQueue queue, MyStuff* data)
{
    ...
    printf("insertLifo()  name=%s val=%d \n", data->name, data->val);
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...