2016-10-08 8 views
-2

Я хочу вернуть динамический массив по ссылке из функции void. Я уже искал 3 часа ответа, не нашел ничего полезного. Вот мой упрощенный код:Как вернуть динамический массив из функции void в c?

main() 
{ 
    int **a; 

    xxx(&a); 

    printf("%d\n\n", a[1]); 

} 

void xxx(int **a) 
{ 
    int i; 

    *a = (int*)malloc(5 * 4); 

    for (i = 0; i < 5; i++) 
     a[i] = i; 
    printf("%d\n\n", a[1]); 
} 

Я просто хочу, чтобы выделить динамический массив в «ххх» функции и вернуть его по ссылке на главной, чем я хочу, чтобы распечатать его или использовать его для чего-то другого. Заранее спасибо :)

редактировать

#include <stdio.h> 
#include <stdlib.h> 
#define MACROs 
#define _CRT_SECURE_NO_WARNINGS 

void xxx(int **a); 


int main(void) 
{ 
    int *a; 

    xxx(&a); 

    printf("%d\n\n", a[1]); 
} 


void xxx(int **a) 
{ 
    int i; 

    *a = malloc(5 * sizeof(**a)); 

    for (i = 0; i < 5; i++) 
     a[i] = i; 
    printf("%d\n\n", a[1]); 
} 
+0

[Пожалуйста, просмотрите эту дискуссию о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+0

Вы близки, но с кодом все еще есть много вещей. Вы должны действительно слушать свой компилятор, поскольку он будет кричать на вас.И если нет, тогда вам нужно поднять уровень предупреждения (который вы должны делать в любом случае). –

+0

Не используйте «магические числа». Либо «# define» их (для длины массива говорят), либо используйте 'sizeof' (для стандартных или более сложных пользовательских типов). –

ответ

0

В вашем main(), вам нужно иметь указатель, а не указатель на указатель. изменить

int **a; 

в

int *a; 

и внутри xxx(), изменить

a[i] = i; 

в

(*a)[i] = i; 

Это говорит

  • Не используйте магические числа, переписать таНос заявление как

    *a = malloc(5 * sizeof(**a)); 
    

    быть более надежными. Кроме того, для статические подсчитывается, используйте #define MACROs.

  • Please see this discussion on why not to cast the return value of malloc() and family in C..

  • main() не является действительной сигнатурой для размещенной среды. Вы должны использовать, по крайней мере, int main(void).
+0

Я использую новую визуальную студию. Я изменил код, как вы сказали, но он все еще не работает. – Jen

+0

@Jen Что рассказал вам ваш компилятор? некоторые предупреждения? Я обновил свой ответ, BTW. –

1

Я внесла некоторые изменения и добавил некоторые комментарии.

#include <stdio.h>      // please inlcude relevant headers 
#include <stdlib.h> 

#define ELEM 5       // you can change the requirement with a single edit. 

void xxx(int **a)      // defined before called - otherwise declare a prototype 
{ 
    int i; 
    *a = malloc(ELEM * sizeof(int)); // do not use magic numbers, don't cast 
    if(*a == NULL) { 
     exit(1);      // check memory allocation 
    } 
    for (i = 0; i < ELEM; i++) { 
     (*a)[i] = i;     // index correctly 
    } 
} 

int main(void)       // 21st century definition 
{ 
    int *a;        // correct to single * 
    int i; 
    xxx(&a); 
    for (i = 0; i < ELEM; i++) {  // show results afterwards 
     printf("%d ", a[i]); 
    } 
    printf("\n"); 
    free(a);       // for completeness 
} 

выход программы:

0 1 2 3 4 
-1

Ok ребята так что сделал его работы является

a[i] = i; 

к

(*a)[i] = i; 

3 часа для такого простого ответа. Спасибо вам всем. Может кто-нибудь объяснить, почему это была проблема?

+0

Ну, это была не единственная проблема, другая была 'int ** a;' в 'main'. Но '(* a) [i] = i;' вводит дополнительный уровень нумерации, необходимый - и повторить первую точку в этом комментарии, удалить эту косвенность в 'main'. –

+0

@WeatherVane Прежде чем я разместил здесь, я попытался изменить что-то в коде, например, от ** a до * a, но ничего не получилось, я много пробовал, но даже не думал об этом (* a) [i] = i. Честно говоря, я не понимал, почему это должно быть так, но спасибо в любом случае – Jen

 Смежные вопросы

  • Нет связанных вопросов^_^