取消引用指针

时间:2011-05-06 12:19:05

标签: c pointers

当我在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);
}

3 个答案:

答案 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à。