LINUX.ORG.RU

возврат массива из фу-ии Си


0

0

Здравствуйте! Можно ли сделать так на Си: int mas[2]; mas = func(); чтобы функция возвратила массив из двух целых. Если можно, то как описать данную функцию? Зарание спасибо!

anonymous

функции в си не умеет возвращать массивы. открывай учебник и кури главу "указатели"

friday ★★★
()

можно массив обернуть в структуру. Старый Си не умел возвращать структуры, новый умеет.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

А не проще указатель на память вернуть? Естественно, не на стек функции :)

anonymous_incognito ★★★★★
()

Можно в качестве аргумента указать массив, а он передается как указатель, вот его и использовать.

stassats ★★★★
()

Может пойдет? Почти похоже. 

#include <stdio.h>

int * f(){
  int a[2]={4,5};
  int *p=a;
  return p;
}

int main(){
  int * ptr=f();
  printf("1: %d\n2: %d\n",ptr[0],ptr[1]);
  return 0;

}

vikeng
()
Ответ на: комментарий от vikeng

vikeng:

Нельзя так делать!

> Программа рабочая, все компилируется и работает.

А ты еще чего-нибудь вызови, она и перестанет работать.
Например, попробуй такое у себя прогнать:

#include <stdio.h>
#include <stdlib.h>

int * f(){
  int a[2]={4,5};
  int *p=a;
  return p;
}

int main(){
  int * ptr=f();
  printf("%s!Never return pointer to local variable!!\n",
          getenv("LOGNAME"));
  printf("1: %d\n2: %d\n",ptr[0],ptr[1]);
  return 0;
}

Die-Hard ★★★★★
()
Ответ на: комментарий от vikeng

> Ничего. Программа рабочая, все компилируется и работает.

Ёлки-палки, я в шутку предостерёг от выдачи адреса локальной переменной на стеке, а ты мало того что так сделал, ещё и полагаешь нормальным.

1)Локальная переменная размещается в стеке функции, т.е. в области памяти, закреплённой за функцией _только_ на время её вызова.

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

3)Правильно будет, использовать функцию выделения памяти в куче (malloc, calloc, new, ещё что-нибудь) и работать с ней.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Не знал. Спасибо, что объяснили. А я-то думал, что если работает, то и проблем нет. :)

vikeng
()

Вроде в чистом С нет разницы между указателями и массивами но возвратить из функции можно только ссылку на глобальный объект или указатель на память выделенную внутри тела функции

anonymous
()
Ответ на: комментарий от anonymous

>Вроде в чистом С нет разницы между указателями и массивами

небольшая всётаки есть: например их по разному понимает sizeof()

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.