Возвращение массивов с пользовательской функцией в не работает - PullRequest
0 голосов
/ 23 мая 2018

Я новичок в программировании на C.Взгляните на мой код и укажите, где я делаю неправильно?Вот мой код для создания функции диапазона, которая должна возвращать массив int.

#include<stdio.h>
int * range(int a, int b);

main()
{
    int *r;
    int j;
    r = range(0,5);
    printf("%d",r[0]); // getting the first one to check array but not working
                       // instead showing segmantation fault
}

int * range(int a, int b) {

    int last[b];
    int i,j;

    for(i=a;i<b;i++){
        last[i] = i;
    }

    return last;
}

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

Ваша непосредственная проблема заключается в том, что last массив перестает существовать , как только выходит из функции range, поэтому возвращаемый указатель больше не действителен.

Если выЕсли range выделит память для массива, а также инициализирует его содержимое, то вам придется динамически распределять память:

int *range( int a, int b )
{
  int *last = malloc( sizeof *last * b );
  if ( last )
  {
    for ( size_t i = a; i < b; i++ )
      last[i] = i;
  }
  return last;
}

Вам нужно будет запомнить free эту памятькогда вы закончите с этим.

Быстрый комментарий - мне не ясно, как вы собираетесь range работать, когда дело доходит до установки значений.Если бы вы вызвали range(3,6), вы бы получили массив из 6 элементов, но вы бы только установили значения last[3], last[4] и last[5], оставив от last[0] до last[2], содержащие неопределенные значения,Если это то, что вы хотели, отлично.Если нет, вы захотите переосмыслить это.

0 голосов
/ 23 мая 2018

Вот рабочий код

#include<stdio.h>
int * range(int a, int b);

int main()
{
     int *r;
     int j;
     r = range(0,5);
     printf("%d",r[1]); // Outputs 1
     free(r);
     return 0;
}

int * range(int a, int b){
    int *last = malloc(sizeof(int) * b);
    int i,j;
    for(i=a;i<b;i++){
        last[i] = i;
    }
    return last;
}

Вы можете запустить в Ideone https://ideone.com/OzaYoL

0 голосов
/ 23 мая 2018

Это происходит потому, что ваша функция int * range(int a, int b); возвращает адрес локальной переменной .Таким образом, чтобы исправить это, вы должны динамически выделить память для last.

Попробуйте этот код:

int *last=(int *)malloc(sizeof(int)*b);

Это будет работать.

0 голосов
/ 23 мая 2018

Вы возвращаете адрес локального массива, время жизни которого заканчивается функцией.

Измените

int last[b];

на

int *last = malloc(sizeof(int) * b);

Не забудьтезвоните free(r); после printf

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