Ошибка при возврате массива из функции в C - PullRequest
0 голосов
/ 02 июля 2018

У меня есть вопрос.

Я не могу скомпилировать свою программу. Это очень простая программа, которая присваивает массив переменной и передает ее в качестве аргумента в функцию. Теперь, возвращая этот массив, он возвращает массив.

Теперь я столкнулся с синтаксической ошибкой, которая выглядит следующим образом:

p2.c: 3: 4: ошибка: ожидаемый идентификатор или ‘(’ до маркера ‘[’] int [] lifo (int [] arr)

Я не могу устранить ошибку для следующей программы:

#include<stdio.h>

int[] lifo(int[] arr)
{
    return arr;
}

int main()
{
    int arr1[100],arr2[100],arr[100];
    int arr1_size,arr2_size,arr_size,i;
    printf("Enter size of array1: \n");
    scanf("%d",&arr1_size);
    printf("Enter size of array2: \n");
    scanf("%d",&arr2_size);
    printf("Enter elements of array1: \n");
    for(i=0;i<arr1_size;i++)
    {
        scanf("%d",&arr1[i]);
    }
    printf("Enter elements of array2: \n");
    for(i=0;i<arr2_size;i++)
    {
        scanf("%d",&arr2[i]);
    }
    printf("Combining 2 arrays: \n");
    arr_size=arr1_size+arr2_size;
    arr=lifo(arr1);
    for(i=0;i<arr1_size;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

В C вы всегда передаете массивы по его адресу, например по его началу. Чтобы сделать это, вы должны использовать указатели. Это означает, что определение вашей функции недопустимо. Это должно выглядеть так:

int* lifo(int* arr)
{
   return arr; 
}

Но эта реализация не имеет никакого смысла, потому что вывод указывает на то же место, что и ввод. Пожалуйста, обратитесь к книгам, которые объясняют вам, как массивы обрабатываются в C.

0 голосов
/ 02 июля 2018

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

int[] lifo(int[] arr)

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

int lifo(int arr[])[]

Если вы попробуете это, хороший компилятор выдаст вам такую ​​ошибку:

ошибка: "lifo" объявлен как функция, возвращающая массив

Недопустимо возвращать массив.

Компилятор не жалуется на параметр int arr[], хотя: это из-за специального правила для параметров функции - если они имеют тип массива, они автоматически настраиваются на соответствующий тип указателя. Итак, следующие объявления функций точно такие же:

void lifo(int arr[]);
void lifo(int *arr);

Вы не можете передавать или возвращать массивы. Но синтаксис позволяет функции выглядеть так: она будет принимать массив - вместо этого она берет указатель на первый элемент этого массива.

0 голосов
/ 02 июля 2018

lifo(int[] arr)

Преврати это в:

lifo( int * arr )

или

lifo( int arr[] )

Обратите внимание, что даже второй вариант все еще будет передавать указатель , а не массив. (Например, вы не сможете определить количество элементов по sizeof().) Вы по-прежнему можете использовать индексированный доступ для arr, но вы можете сделать это для любого указателя.

Что касается возвращаемого значения, используйте int *. В конце концов, это то, что вы будете возвращать - другой указатель , а не массив.

(Ваша функция lifo, конечно, не работает ... Я предполагаю, что это только для примера.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...