Вернуть массив в c - PullRequest
       11

Вернуть массив в c

4 голосов
/ 10 марта 2010

Я хотел бы знать, есть ли способ вернуть массив символов. Я пробовал что-то вроде этого "char [] fun ()", но я получаю ошибку.

Мне не нужно указательное решение. Спасибо!

Ответы [ 5 ]

11 голосов
/ 10 марта 2010

Вы можете вернуть массив, поместив его в структуру:

struct S {
   char a[100];
};

struct S f() {
    struct S s;
    strcpy( s.a, "foobar" );
    return s;
}
5 голосов
/ 10 марта 2010

Массивы не могут быть переданы или возвращены по значению в C.

Вам потребуется либо принять указатель и размер буфера для хранения ваших результатов, либо вам придется возвращать другой тип, например указатель. Первое часто предпочитается, но не всегда подходит.

4 голосов
/ 10 марта 2010

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

int a[10];
a = foo();

Массивы в Си обрабатываются иначе, чем другие типы; в большинстве контекстов тип выражения массива неявно преобразуется («распадается») из «массива N-элемента T» в «указатель на T», и его значение устанавливается для указания на первый элемент в массиве. Исключениями из этого правила являются случаи, когда выражение массива является операндом операторов sizeof или address-of (&) или когда выражение является строковым литералом, используемым для инициализации другого массива в объявлении.

С учетом декларации

T a[N];

для любого типа T, тогда выполняются следующие условия:

Expression     Type      Decays to      Notes
----------     ----      ---------      -----
         a     T [N]     T *            Value is address of first element
        &a     T (*)[N]  n/a            Value is address of array (which
                                          is the same as the address of the
                                          first element, but the types are
                                          different)
  sizeof a     size_t    n/a            Number of bytes (chars) in array = 
                                          N * sizeof(T)
sizeof a[i]    size_t    n/a            Number of bytes in single element = 
                                          sizeof(T)
       a[i]    T         n/a            Value of i'th element
      &a[i]    T *       n/a            Address of i'th element

Из-за правила неявного преобразования, когда вы передаете аргумент массива функции, функция получает значение указателя, а не значение массива:

int a[10];
...
foo(a);
...

void foo(int *a)
{
  // do something with a
}

Обратите внимание, что делать что-то вроде

int *foo(void)
{
  int arr[N];
  ...
  return arr;
}

не работает; после выхода из функции массив arr технически больше не существует, и его содержимое может быть перезаписано, прежде чем вы сможете его использовать.

Если вы не распределяете буферы динамически, вам лучше всего передать массивы, которые вы хотите изменить, в качестве аргументов функции вместе с их размером (поскольку функция получает только значение указателя, она не может определить, насколько велик массив есть):

int a[10];
init(a, sizeof a / sizeof a[0]);  // divide the total number of bytes in 
...                               // in the array by the number of bytes
void init(int *a, size_t len)     // a single element to get the number
{                                 // of elements
  size_t i;
  for (i = 0; i < len; i++)
    a[i] = i;
}
3 голосов
/ 10 марта 2010

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

0 голосов
/ 29 января 2015

Очень базовый код и очень простое объяснение. КАК ВОЗВРАТИТЬ массив обратно из пользовательской функции в основную функцию .. Надеюсь, это помогает !! Ниже я дал полный код, чтобы кто-нибудь понял как именно это работает? :):)

#include<iostream>
using namespace std;

char * function_Random()
{
    int i;
    char arr[2];
    char j=65;//an ascII value 65=A and 66=B
    cout<<"We are Inside FunctionRandom"<<endl;
    for(i=0;i<2;i++)
    {
        arr[i]=j++;// first arr[0]=65=A and then 66=B
        cout<<"\t"<<arr[i];
    }
    cout<<endl<<endl;
    return arr;
}
int main()
{

    char *arrptr;
    arrptr=function_Random();
    cout<<"We are Inside Main"<<endl;
    for(int j=0;j<2;j++)
    {
        cout<<"\t"<<arrptr[j];
    }
    return 0;
}
...