2015-01-26 3 views
-5
int*func(); 
    int main() 
    { 
    int i; 
    int *ptr; 
    ptr=func(); 
    for(i=0;i<10;i++) 
    { 
    printf("%d ",*ptr); 
    ptr++; 
    } 
    } 

    int* func() 
    { 
    int arr[10]; 
    int i; 
    for(i=0;i<10;i++) 
    arr[i]=i+1; 
    return arr; 
    } 

Почему я не получаю свою продукцию как 1,2,3,4,5,6,7,8,9,10 ??Почему я не получаю правильный выход?

Я возвращаю адрес массива из func(), но Я все еще получаю ненужные значения.

ответ

1

Wow - агрессивный downvoting! Дайте новому человеку шанс людей!

Ответ «scope». При компиляции с GCC, вы получите очень очевидное предупреждение:

C:\tmp>gcc test.c 
test.c: In function `func': 
test.c:22: warning: function returns address of local variable 

Локальных переменным теряются при выходе из функции и ее распределение памяти очищаются.

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

+0

Я считаю, что агрессивный вниз голосования, вероятно, связано с тем, что существует множество повторяющихся вопросов на эту тему уже, так что ОП предположительно не сделал каких-либо исследований до начала размещения. –

+0

кроме malloc can not я использую что-нибудь еще ?? – CodeHacker

+0

Да, измените 'int arr [10];' на 'static int arr [10];', [посмотреть] (http://stackoverflow.com/q/572547/1606345) –

1

Вы возвращаете указатель на локальную переменную, что приводит к неопределенному поведению.

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

void func(int arr[]); 

int main() 
{ 
    int arr[10]; 

    func(arr); 

    for (int i = 0; i < 10; i++) 
     printf("%d ", arr[i]); 

    return 0; 
} 

void func(int arr[]) 
{ 
    for (int i = 0; i < 10; i++) 
     arr[i] = i + 1; 
} 
Смежные вопросы