C,无法通过解除引用,未知分段错误检索变量值

时间:2012-07-28 09:06:00

标签: c pointers methods dereference

如果我对方法中的指针进行操作,它就可以工作。但是当在另一个方法中用作参数时,相同的操作失败。显然我缺少一些东西。我的猜测是因为某种原因,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教程,但我找不到具体原因,为什么会发生这种情况,或者如何解决它。

由于

4 个答案:

答案 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,则会传递ptrfoobar(*ptr);,因此foobar会将10作为地址。使用10作为地址 - 它在作为foobar主体的单行中被取消引用 - 会导致段错误。

调用函数,传递指针,如下所示:foobar(ptr);,您可以像main中的语句一样使用该值。