在C99中的除法中使用指针,错误:到二进制的操作数无效
这个问题看起来确实很愚蠢,但我总是浪费很多时间,测试/错误直到它起作用,处理这类问题 我需要一个指针从函数返回一个值,然后我需要除以这个值,但我有编译器错误:在C99中的除法中使用指针,错误:到二进制的操作数无效,c,pointers,c99,C,Pointers,C99,这个问题看起来确实很愚蠢,但我总是浪费很多时间,测试/错误直到它起作用,处理这类问题 我需要一个指针从函数返回一个值,然后我需要除以这个值,但我有编译器错误: 二进制操作数无效/(有'int*'和'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)
二进制操作数无效/(有'int*'和'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,只获取指针地址,等等。您当前的问题是您已将
x
声明为指向int的指针,但您试图将其用作int。要简单地更正最后一行,请取消引用指针(就像您在test()中正确执行的操作一样)
):
现在,您似乎真的尝试过了,但出现了一个错误,这并不奇怪,因为您的x
初始化得很糟糕:
int *x = 20;
这不会创建int值20并使x指向它。它将x设置为指向由整数值20表示的内存地址。这可能是保留内存,这就是为什么在尝试取消引用时会出现错误
(在test()
中不会出现该错误,因为您已将x
的地址作为参数传递。因此,在那里取消引用它实际上会使您得到20个-可能)
要使指针工作,请执行以下操作之一:
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
)int*x=20
表示:x
是指向存储在地址20
处的int
的指针。当您遵从它时,CPU将尝试从地址20
读取int
值,但地址20
在当前进程空间中是无效地址,因此程序崩溃
您可能想说的是:x
是指向int
的指针,它指向的int
的值是20
,对吗?嗯,这应该是:
int someInt = 20;
int * x = &someInt;
现在
x
指向存储其值的任何地址someInt
(实际上它位于主函数的堆栈空间中,但这只是一个侧节点),而存储在该地址的值实际上是20
谢谢Mat,我编辑了这个问题。如果只是交叉编译导致崩溃,也许我应该更改标题?int*x=20
使x
成为指向地址20的指针,在地址20中存储int
可能是不合法的。你希望这样做能达到什么目的?指针需要指向某个地方。这在每个平台上都是无效的代码,尽管在某些平台上可能很幸运。它只能从更大的函数返回值。使用int*x
时,您有x
是一个指针。。。int*x=20代码>您希望该指针为20
<代码>20
??地址20是什么,假设你的计算机不想让一个指针有那个值?指针的除法是什么意思?这就像问鱼的平方是多少,或者说是所有恐惧总和的一半。谢谢你的澄清,戴夫。
int test(x,y) { return x+y; }
...
int x = 20;
...
x = test(x,y);
...
float res = x / 2;
int someInt = 20;
int * x = &someInt;