Использование указателей в делении в C99, ошибка: недопустимые операнды в двоичные - PullRequest
0 голосов
/ 27 апреля 2020

Вопрос, конечно, выглядит глупо, но я всегда тратил впустую много времени, с тестами / ошибками, пока он не работает, с такой проблемой.

Мне нужен указатель, чтобы вернуть значение из функции , затем мне нужно разделить это значение, но у меня есть ошибка компилятора:

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 и получить только адрес указателя, et c.

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Ваша непосредственная проблема в том, что вы объявили x как указатель на int, но вы пытаетесь использовать его как int. Чтобы просто исправить последнюю строку, разыменуйте указатель (точно так же, как вы правильно сделали внутри test()):

float res = *x / 2;

Теперь, похоже, вы действительно попытались это сделать и получили ошибку, что неудивительно потому что вы плохо инициализировали x:

int *x = 20;

Это не создает значение int 20 и не указывает на него 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, если вы хотите получить результат с плавающей точкой вместо int.)

0 голосов
/ 27 апреля 2020

int * x = 20; означает: x - указатель на int, сохраненный по адресу 20. Когда вы обращаетесь к нему, ЦП будет пытаться прочитать значение int с адреса 20, но адрес 20 является недопустимым адресом в текущем пространстве процесса, и, следовательно, ваша программа вылетает.

Что вы вероятно, хотел бы сказать: x - это указатель на int, а значение int, на которое он указывает, равно 20, верно? Ну, это было бы:

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

Теперь x указывает на любой адрес someInt, хранящий его значение (на самом деле он находится в пространстве стека основной функции, но это просто боковой узел) и по этому адресу хранится значение 20.

...