C - функция возвращает массив - PullRequest
3 голосов
/ 16 марта 2012

Я пишу метод, который получает число l и возвращает вектор размера l со случайными числами.У меня есть этот код, но не работает

#include <time.h>    

 int makea (int z) {
    int a1[z];
    int i;

    for (i = 0; i < tam; i++) {
        a1[i]=srand(time(0));
    }
    return a1;
 }

Это ошибки, которые компилятор возвращает мне

arrays1.c: В функции 'makea':
arrays1.c: 12: ошибка: пустое значение не игнорируется, поскольку оно должно быть
arrays1.c: 14: предупреждение: возвращение делает целое число из указателя без приведения
arrays1.c: 14: предупреждение: функция возвращает адреслокальная переменная

Я думаю, что это проблема указателей ... но я не совсем уверен

Ответы [ 5 ]

6 голосов
/ 16 марта 2012

Несколько проблем:

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

Итак, чтобы исправить, используйте malloc и указатель:

int *makea (int z) {
    int *a1 = malloc(sizeof(int) * z);
    int i;

    srand(time(NULL));
    for (i = 0; i < tam; i++) {
        a1[i]= rand();
    }

    // remember to free a1 when you are done!
    return a1;
}

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

Однако также обратите внимание, что malloc зависит от реализации , что означает, что реализация может теоретически очистить память перед возвратом.

1 голос
/ 16 марта 2012

Ваша лучшая ставка:

  1. Объявите массив вне процедуры и передайте его для его инициализации:

    void init_array (int a[], nelms)

  2. План B - это передача указателя на указатель и процедура его выделения и инициализации

Пример:

void alloc_and_init_array (int **a_pp, int nelms)
{
  *a_pp = malloc (sizeof (int) * nelms);
  ...

... или, что эквивалентно ...

int *
alloc_and_init_array (int nelms)
{
  int *a_p = malloc (sizeof (int) * nelms);
  ...
  return a_p;
0 голосов
/ 16 марта 2012
#include <time.h>    

int makea (int z) {
    int *a1 = (int*)malloc(z*sizeof(int));
    int i;

    for (i = 0; i < tam; i++) {
        a1[i]=srand(time(0));
    }

    return a1;
}

ВАЖНО: не забывайте освобождать память, выделенную где-то снаружи, когда она вам больше не нужна.

0 голосов
/ 16 марта 2012

Локальная переменная, такая как ваш массив, расположена в стеке. При возврате функции она удаляется из стека, поэтому возвращаемый указатель указывает на нераспределенную область памяти.

Вы должны выделить массив с помощью malloc () или передать уже существующий массив функции.

0 голосов
/ 16 марта 2012

Ну, во-первых, ваша функция говорит, что она возвращает int, но вы хотите вернуть массив, так что это неправильно. Конечно, вы также не можете вернуть массив в C ...

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

Кроме того, ваш массив размещен локально, поэтому, даже если компилятор не жаловался, вы бы вернули неверную память.

int makea (int size, int **out_array) {
    int *temp, i;
    if(!out_array)
        return 0;
    temp = malloc(sizeof(int) * size);
    if(!temp)
        return 0;

    srand(time(0));
    for (i = 0; i < size; ++i) 
        temp[i] = rand();        

    *out_array = temp;
    return 1;
 }

int main() {
    int *arr;
    if(!makea(10, &arr)) {
        printf("Failed to allocate array");
        return -1;   
    }

    return 0
}

Другое примечание:

temp[i] = srand(time(0));        

Это неправильно. srand запускает генератор случайных чисел, но не возвращает случайное число. Вы набираете srand для ввода начального числа, а затем набираете rand, чтобы получить случайное число.

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