Получение ошибки в моей функции, которая возвращает значения в массиве с использованием указателей на C

#c #arrays #function #pointers

#c #массивы #функция #указатели

Вопрос:

Я пытаюсь изучить массивы и указатели в C. Я пытаюсь написать программу, которая в функции: получает 2 числа от пользователя, помещает их в массив и возвращает их в основную функцию. Я получаю ошибку и не понимаю, в чем проблема. Вот мой код:

 #include<stdio.h>

void get_nums(float *x)
{
    float num1, num2;

    printf("enter two numbers: ");
    scanf("%f %f", amp;num1, amp;num2);

    *x[0] = num1;
    *x[1] = num2;

}

main(){

    float x[2];
    float (*p_x)[2] = amp;x;

    get_nums(p_x[2]);

    printf("Number 1: %fnNumber 2: %f", x[0], x[1]);

    return 0;
}
  

Я получаю ошибку в этих 2 строках

     *x[0] = num1;
    *x[1] = num2;
  

Сообщение об ошибке является

Ошибка: операндом ‘*’ должен быть указатель

Я не понимаю, что здесь не так. Кто-нибудь видит проблему?

РЕДАКТИРОВАТЬ: я изменил 2 строки на

     x[0] = num1;
    x[1] = num2;
  

и теперь я могу запустить программу. Однако я получаю новую ошибку после ввода двух чисел. Сообщение об ошибке является:

   Unhandled exception at 0x40e00000 in arraysandpointers.exe: 0xC0000005: Access violation.
  

Ответ №1:

Вам не нужно * . Просто это нормально:

 x[0] = num1;
x[1] = num2;
  

В вашем исходном коде x[0] уже есть тип float . *x[0] попытаюсь выполнить ее уважение, что невозможно, поскольку x[0] это не указатель. Поэтому она не компилируется.

РЕДАКТИРОВАТЬ: Также измените свой main на this:

 int main(){

    float x[2];
    get_nums(x);

    printf("Number 1: %fnNumber 2: %f", x[0], x[1]);

    return 0;
}
  

Необязательно иметь p_x . И это то, что вызывает сбой.

Комментарии:

1. Это сработало, однако теперь я получаю новую ошибку. После того, как я ввожу два числа, я получаю ошибку: «Необработанное исключение в 0x40e00000 в arrayandpointers.exe : 0xC0000005: нарушение доступа.»

Ответ №2:

*X может рассматриваться как X подобный X[] массив. Поэтому, когда вы пишете as *X[0] , это рассматривается как 2D-массив. Поэтому удалите указатели в X[0] и X[1] .

Удалите эти две строки:

 float (*p_x)[2] = amp;x;
get_nums(p_x[2]);
  

Вы можете напрямую сделать get_nums(x) .