Use of pointers in a division in C99, error: invalid operands to binary
Use of pointers in a division in C99, error: invalid operands to binary
这个问题看起来确实很愚蠢,但我一直浪费了很多时间,tests/errors直到它起作用,这种问题。
我需要一个指向return函数值的指针,然后我需要除这个值,但是我有编译器错误:
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 并且只获取指针地址等。
您的直接问题是您已将 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;
但你实在是太难了。由于您只需要从函数输出一个值,只需使函数 return 该值即可。那么你根本不需要乱用指针:
int test(x,y) { return x+y; }
...
int x = 20;
...
x = test(x,y);
...
float res = x / 2;
(最后,我相信在任何情况下你都想在最后一行使用 2.0
,而不仅仅是 2
,如果你想得到一个 float 结果而不是一个 int。 )
int * x = 20;
表示:x
是指向存储在地址 20
的 int
的指针。当您引用它时,CPU 将尝试从地址 20
读取一个 int
值,但地址 20
在您当前的进程 space 中是一个无效地址因此你的程序崩溃了。
您可能想说的是:x
是指向 int
的指针,它指向的 int
的值是 20
,对吗?嗯,这本来是:
int someInt = 20;
int * x = &someInt;
现在x
指向任何地址someInt
存储它的值(实际上它在主函数的堆栈space上,但那只是一个侧节点)和存储的值该地址实际上是 20
.
这个问题看起来确实很愚蠢,但我一直浪费了很多时间,tests/errors直到它起作用,这种问题。
我需要一个指向return函数值的指针,然后我需要除这个值,但是我有编译器错误:
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 并且只获取指针地址等。
您的直接问题是您已将 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;
但你实在是太难了。由于您只需要从函数输出一个值,只需使函数 return 该值即可。那么你根本不需要乱用指针:
int test(x,y) { return x+y; }
...
int x = 20;
...
x = test(x,y);
...
float res = x / 2;
(最后,我相信在任何情况下你都想在最后一行使用 2.0
,而不仅仅是 2
,如果你想得到一个 float 结果而不是一个 int。 )
int * x = 20;
表示:x
是指向存储在地址 20
的 int
的指针。当您引用它时,CPU 将尝试从地址 20
读取一个 int
值,但地址 20
在您当前的进程 space 中是一个无效地址因此你的程序崩溃了。
您可能想说的是:x
是指向 int
的指针,它指向的 int
的值是 20
,对吗?嗯,这本来是:
int someInt = 20;
int * x = &someInt;
现在x
指向任何地址someInt
存储它的值(实际上它在主函数的堆栈space上,但那只是一个侧节点)和存储的值该地址实际上是 20
.