当我在fill函数中打包结构并传递指针以发送如何取消引用它时,如何取消引用指针?因为我在我所做的事情中得到了分段错误
#include<stdio.h>
struct xxx
{
int x;
int y;
};
void fill(struct xxx *create)
{
create->x = 10;
create->y = 20;
send(*create);
}
main()
{
struct xxx create;
fill(&create);
}
send(struct xxx *ptr)
{
printf("%d\n",ptr->x);
printf("%d\n", ptr->y);
}
答案 0 :(得分:10)
send(*create)
将发送实际的struct对象,而不是指针。
send(create)
会发送指针,这就是你需要的。
当函数声明的参数包含星号(*)时,需要指向某事物的指针。当你将该参数传递给另一个需要另一个指针的函数时,你需要传递参数的名称,因为它已经是一个指针。
使用星号时,您取消引用指针。这实际上发送了“create
指向的内存单元格”,实际的结构而不是指针。
答案 1 :(得分:2)
该行
send(*create);
应该是
send(create);
create变量已经是指针,不需要*
答案 2 :(得分:1)
如果你曾要求编译器帮助你,你就不会问这个问题(没有冒犯!)。编译器是你的朋友。启用它的警告。例如GCC with
gcc -Wall yourcode.c
给你
yourcode.c: In function ‘fill’:
yourcode.c: 11:5: warning: implicit declaration of function ‘send’
yourcode.c: At top level:
yourcode.c:15:5: warning: return type defaults to ‘int’
yourcode.c:22:5: warning: return type defaults to ‘int’
yourcode.c: In function ‘send’:
yourcode.c:26:5: warning: control reaches end of non-void function
yourcode.c: In function ‘main’:
yourcode.c:19:5: warning: control reaches end of non-void function
现在你知道你应该为函数send
编写一个原型,或者将它的定义移到第一次使用之上。并且由于编译器假定send
的默认返回类型,您显然忘记指定它(这里显然是void
,因为您没有任何返回值)。 main
返回类型int
和
return 0;
缺失。
通过上述修改,编译器会告诉你
yourcode.c: In function ‘fill’:
yourcode.c:12:5: error: incompatible type for argument 1 of ‘send’
yourcode.c.c:7:6: note: expected ‘struct xxx *’ but argument is of type ‘struct xxx’
你会注意到你有一个多余的*
send(*create);
取消引用你的指针。注意:您不希望取消引用指针,因为您必须将指针转发到send
而不是值。将行更改为
send(create);
etVoilà。