【问题标题】:Use of pointers in a division in C99, error: invalid operands to binary在 C99 的除法中使用指针,错误:二进制操作数无效
【发布时间】:2020-04-27 19:44:10
【问题描述】:

这个问题确实看起来很愚蠢,但我总是浪费很多时间,测试/错误,直到它工作,这种问题。

我需要一个指针来从函数中返回一个值,然后我需要将该值相除,但是我有编译器错误:

invalid operands to binary / (have 'int *' and 'int')

以下代码中的示例:

void test(int *x, int y)
{
    *x = *x+y;
}

int main()
{
    int *x = 20;
    int y = 1;

    test(&x, y);

    printf("x: %i", x);

    float res = x / 2; // error: invalid operands to binary / (have 'int *' and 'int')

    //float res = *x / 2; // application crash with this one. (GCC native Android)
}

我尝试使用 '&' 但它不起作用(x = 0),我尝试强制转换为 int 并且只获取指针地址等。

【问题讨论】:

  • 谢谢 Mat,我编辑了这个问题。如果只是交叉编译崩溃,也许我应该更改标题?
  • int *x = 20 使x 成为指向地址 20 的指针,在那里存储 int 可能是不合法的。你希望通过它实现什么?指针需要指向某个地方。这在每个平台上都是无效的代码,尽管它在某些平台上可能会靠运气。
  • 只是为了能够从更大的函数中返回值。
  • 与int *x 你有x 是一个指针... 与int *x = 20; 你希望那个指针是20!??! 20??地址 20 是什么,假设您的计算机不喜欢让指针具有该值?
  • 指针分割是什么意思?这就像问鱼的平方是什么,或者是所有恐惧总和的一半。

标签: c pointers c99


【解决方案1】:

您的直接问题是您已将 x 声明为指向 int 的指针,但您正试图将其用作 int。要简单地更正最后一行,请取消引用指针(就像您在 test() 中正确完成的那样):

float res = *x / 2;

现在,您似乎确实尝试过并且遇到了错误,这并不奇怪,因为您初始化 x 很糟糕:

int *x = 20;

这不会创建 20 的 int 值并使 x 指向它。它将 x 设置为指向由整数值 20 表示的 内存地址。这可能是保留的内存,这就是为什么在尝试取消引用它时会出错。

(您不会在 test() 中收到该错误,因为您已将 x 的地址作为参数传递。因此,在此处取消引用实际上确实会得到 20 - 可能。)

要使指针起作用,请执行以下操作:

int x = 20;
...
test(&x, y)
...
float res = x / 2;

或:

int *x = malloc(sizeof(int));
*x = 20;
...
test(x, y)
..
float res = *x /2;

但是你真的让这太难了。由于您只需要从函数中输出一个值,因此只需让函数返回该值即可。那你就完全不用纠结指针了:

int test(x,y) { return x+y; }
...
int x = 20;
...
x = test(x,y);
...
float res = x / 2;

(最后,我相信无论如何你都想在最后一行使用2.0,而不仅仅是2,如果你想得到一个浮点结果而不是一个整数。)

【讨论】:

  • 感谢 Dave 的所有澄清。
【解决方案2】:

int * x = 20; 表示:x 是指向存储在地址20 的int 的指针。当你遵从它时,CPU 会尝试从地址20 读取int 值,但地址20 在你当前的进程空间中是一个无效地址,因此你的程序会崩溃。

您可能想要说的是:x 是指向int 的指针,它指向的int 的值是20,对吗?好吧,这本来是:

int someInt = 20;
int * x = &someInt;

现在x 指向someInt 存储其值的任何地址(实际上它在主函数的堆栈空间中,但这只是一个侧节点)并且存储在该地址的值实际上是20。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多