0

如果我对方法内的指针进行操作,它就可以工作。但是当在另一种方法中用作参数时,相同的操作会失败。显然我缺少一些东西。我的猜测是由于某种原因 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(unsigned short b) 无法编译,我如何将我的变量传递给 foobar(通过反复试验,我发现您只能使用基本类型作为参数)。

如果有人能“指出”我的解释,我将不胜感激。我已经阅读了几个 C 教程,但我找不到发生这种情况的具体原因,或者如何解决它。

谢谢

4

4 回答 4

2

这里

 foobar(*ptr);

您正在将取消引用的指针发送到该函数。因此,您传递的是一个无符号短参数,而不是指向无符号短的指针。该函数需要一个指针,因此您应该传递一个指针。你需要的是

 foobar(ptr);

你的代码将编译

于 2012-07-28T09:09:23.987 回答
1

你应该传递ptrfoobar,而不是*ptr

于 2012-07-28T09:08:07.090 回答
1

发生这种情况是因为您传递的不是存储在 ptr 中的 b 的地址,而是 b 的值。换句话说,foobar 的 ptr = 10,这不是一个有效的地址。当您在 ( unsigned short c = 10 & (*ptr);) 内取消引用它时,您会遇到段错误。

看起来您只需将指针传递给 foobar 函数,这可以通过以下方式实现foobar(ptr);

于 2012-07-28T09:10:43.950 回答
0

foobar需要一个指向unsigned short. 但是,当您在参数列表中unsigned short取消引用时,您传递了一个: ,因此作为地址获取。用作地址 - 它在作为主体的单行中被取消引用- 导致段错误。ptrfoobar(*ptr);foobar1010foobar

调用函数,传递你的指针,像这样:foobar(ptr);,你可以使用你在语句中所做的值main

于 2012-07-28T09:10:52.903 回答