Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2015, 01:14   #1
ntum
Новичок
Джуниор
 
Регистрация: 30.03.2015
Сообщений: 1
По умолчанию C - вернуть массив из функции

Начал изучать массивы и указатели в C, и не могу решить проблему, суть которой в том, что функция должна возвращать массив, и она его возвращает, но не в том виде, в котором нужно. Ниже - код и вывод программы
Код:
#include <time.h>
int * initArray()
{
 	int resultArray[5];
	int i;
	time_t t;
	for (i = 0; i<=5; i++)
	{	
		resultArray[i] = time(&t) * rand () % 10;	
		if (resultArray[i] < 0)
		{
			resultArray[i] = resultArray[i] * (-1);
		}
		printf ("From Init %d\t", resultArray[i]);
		printf ("\n");
	}	
	//Вернется УКАЗАТЕЛЬ НА ПЕРВЫЙ ЭЛЕМЕНТ resultArray[0]
	return &resultArray;
}

void outArray (int  *out)
{
	int curIndex;
	for (curIndex = 0; curIndex < 5; curIndex++ )
	{
		printf ("%d\t", (*out) + curIndex );
	}
}
 


void main (void)
{
	
	array[5] = initArray();
	printf("Первый элемент = %d\n", *array );
	printf ("Массив [");
	//array - это указатель на первый элемент массива
	outArray(array);
	printf ("]\n");

}
И вывод
Код:
From Init 8	
From Init 6	
From Init 8	
From Init 2	
From Init 0	
From Init 0	
Первый элемент = -1218272211
Массив [-1218272211	-1218272210	-1218272209	-1218272208	-1218272207	]
Вобщем немного запутался с указателями. Заранее спасибо за помощь.
ntum вне форума Ответить с цитированием
Старый 30.03.2015, 02:10   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

int resultArray[5]; - это статический массив из 5 элементов int. функция возвращает значение указателя на начало этого массива. но косяк в том, что resultArray – локальная переменная, после выхода из области видимости в этих 5 элементах может расположиться любой мусор, но указатель и теперь указывает правильный адрес – тот самый, который функция вернула наружу.

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

з.ы. я художник, я так вижу!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 30.03.2015, 06:41   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Согласен. Нужно из кучи возвращать:
Код:
#include <time.h>
int * initArray(int n)
{
 	int *resultArray=malloc(n*sizeof(int));
	int i;
	time_t t;
	for (i = 0; i<=n; i++)
	{	
		resultArray[i] = time(&t) * rand () % 10;	
		if (resultArray[i] < 0)
		{
			resultArray[i] = resultArray[i] * (-1);
		}
		printf ("From Init %d\t", resultArray[i]);
		printf ("\n");
	}	
	return resultArray;
}

void outArray (int  *out,int n)
{
	int curIndex;
	for (curIndex = 0; curIndex < n; curIndex++ )
	{
		printf ("%d\t", (*out) + curIndex );
	}
}
 


void main (void)
{
	
	int *array = initArray(5);
	printf("Первый элемент = %d\n", array[0] );
	printf ("Массив [");
	//array - это указатель на первый элемент массива
	outArray(array,5);
free(array); // Или как там освобождать правильно?
	printf ("]\n");

}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2015, 12:47   #4
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

так проще:
Код:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

void initArray(int *array, int len){
    int i;
    time_t t;
    for (i = 0; i<len; i++)
    {
        array[i] = time(&t) * rand () % 10;
        if (array[i] < 0)
        {
            array[i] = array[i] * (-1);//Для чего это?
        }
        printf ("From Init %d\n", array[i]);

    }
}

void outArray (int  *out, int len){
    int i;
    for (i = 0; i < len; i++){
        printf("\nArray[%d] = %d", i, out[i]);
    }
}

int main (void){
    const int size = 5;
    int array[size];
    initArray(array, size);

    printf("first element = %d\n", *array );

    //array - это указатель на первый элемент массива
    outArray(array, size);

    return 0;
}
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вернуть список из функции. digiwo C# (си шарп) 9 21.01.2014 00:30
Вернуть указатель на массив из функции Rebelition Общие вопросы C/C++ 3 25.06.2013 01:37
Не могу вернуть массив из функции alik98 Помощь студентам 2 27.02.2013 18:10
Вернуть из функции массив М@лышка Помощь студентам 0 07.01.2010 02:13
Можно ли вернуть динамический массив из функции? worldcentre Помощь студентам 2 06.12.2007 02:37