在C printf

时间:2019-02-28 20:14:52

标签: c pointers printf

我正在学习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);

和其他方式。

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

3 个答案:

答案 0 :(得分:3)

void *是通用指针。它指向的数据类型未知,因此您不能取消引用void *

您应该更改函数以接受MyStuff *,并修改printf调用以打印每个字段。

bool insertLifo(LifoQueue queue, MyStuff* data)
{
    ...
    printf("insertLifo()  name=%s val=%d \n", data->name, data->val);
    ...

答案 1 :(得分:3)

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

bool insertLifo(LifoQueue queue, MyStuff* data)

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

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

%s格式说明符要求像char *一样传递类型为name的参数。

但是,正如我在对您的问题的评论中告诉您的那样,我们需要一个完整且可验证的示例来进行诊断。您没有执行此操作,因此您得到的响应不完整。请阅读How to create a Minimal, Complete, and Verifiable example

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

最后,你说

  

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

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

答案 2 :(得分:1)

要打印指针地址,请使用%p printf format代替用于字符串的%s

如果您需要给printf字符串,可以使用以下命令:

MyStuff *stuff = (MyStuff*)data;
printf("insertLifo() data=%p = {name=%s, val=%d} \n", data, stuff->name, stuff->val);