首页 > 解决方案 > 在 c printf 中无效使用 void 表达式

问题描述

我正在学习 c. 我有这个结构:

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);

和其他方式。

我想完全了解如何使用指针

标签: cpointersprintf

解决方案


您的错误在于您声明的方式insertLifo(),因为您错误地声明了第二个参数。它应该是:

bool insertLifo(LifoQueue queue, MyStuff* data)

所以你可以通过引用传递变量。然后,你必须这样做:

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

因为%s格式说明符需要按原样传递 type 的char *参数name

但是,正如我在对您的问题的评论中告诉您的那样,我们需要一个完整且可验证的示例才能进行诊断。你没有这样做,所以你得到的回复不完整。请阅读如何创建最小、完整和可验证的示例

另一个错误是您可能还需要insertLifo()通过引用传递第一个参数,因为您可能需要修改该结构,如果您按值传递它,它将被复制到函数中,并且您所做的任何修改它将在函数返回时丢失。

最后你说

我想完全了解如何使用指针。

嗯,这完全超出了这个应用程序的范围。StackOverflow 只是帮助你纠正代码中的一个小问题,而不是教你如何编程。我可以说,许多人终其一生都在试图理解如何使用指针,但从未成功。这取决于很多方面,但你可以做的一件好事是买一本关于 C 的好书。


推荐阅读