如果我对方法中的指针进行操作,它就可以工作。但是当在另一个方法中用作参数时,相同的操作失败。显然我缺少一些东西。我的猜测是因为某种原因,foobar无法“看到”* ptr指向的变量。
int main(int argc, char *argv[]){
unsigned short b =15;
unsigned short *ptr = &b;
//If I do it in main it works
unsigned short c = 10 & (*ptr);
//If I send it to foobar, it segfaults
foobar(*ptr);
}
void foobar(unsigned short *ptr){
unsigned short c = 10 & (*ptr);
}
我如何将变量传递给foobar,如果我foobar(unsigned short b)它不编译(通过反复试验我发现你只能使用基本类型作为参数)。
如果有人能指出我的解释,我将不胜感激。我已经阅读了几个C教程,但我找不到具体原因,为什么会发生这种情况,或者如何解决它。
由于
答案 0 :(得分:2)
下面
foobar(*ptr);
您正在向该功能发送解除引用指针。因此,您将无符号短参数传递给unsigned short而不是指针。该函数需要一个指针,所以你应该传递一个指针。你需要的是
foobar(ptr);
您的代码将编译
答案 1 :(得分:1)
您应该将ptr
传递给foobar
,而不是*ptr
。
答案 2 :(得分:1)
这是因为你传递的不是存储在ptr中的b的地址,而是b的值。
换句话说,foobar得到ptr = 10,这不是一个有效的地址。当你在里面取消引用它(unsigned short c = 10 & (*ptr);
)时,你会遇到一个段错误。
看起来你只需要将指针传递给foobar函数,这可以通过以下方式实现foobar(ptr);
。
答案 3 :(得分:0)
foobar
期望指针到unsigned short
。但是,如果您在参数列表中取消引用unsigned short
,则会传递ptr
:foobar(*ptr);
,因此foobar
会将10
作为地址。使用10
作为地址 - 它在作为foobar
主体的单行中被取消引用 - 会导致段错误。
调用函数,传递指针,如下所示:foobar(ptr);
,您可以像main
中的语句一样使用该值。