我正在学习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);
和其他方式。
我想完全了解如何使用指针
答案 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);