¿Es eso posible? Digamos que quiero devolver una matriz de dos caracteres
char arr[2]; arr[0] = 'c'; arr[1] = 'a';de una función. ¿Qué tipo debo usar para la función? ¿Es mi única opción usar punteros y anular la función? Hasta ahora he intentado tener una función char* o char[]. Aparentemente, solo puede tener funciones de char(*[]). La única razón por la que quiero evitar el uso de punteros es el hecho de que la función tiene que terminar cuando encuentra un "devolver algo"; porque el valor de "algo" es una matriz de caracteres (¡no una cadena!) que puede cambiar de tamaño según los valores que pase a la función a través de la función principal. Gracias a quien responda de antemano.
Tienes varias opciones:
1) Asigne su matriz en el montón usando malloc() y devuélvale un puntero. También tendrás que hacer un seguimiento de la longitud tú mismo:
void give_me_some_chars(char **arr, size_t *arr_len) { /* This function knows the array will be of length 2 */ char *result = malloc(2); if (result) { result[0] = 'c'; result[1] = 'a'; } /* Set output parameters */ *arr = result; *arr_len = 2; } void test(void) { char *ar; size_t ar_len; int i; give_me_some_chars(&ar, &ar_len); if (ar) { printf("Array:\n"); for (i=0; i<ar_len; i++) { printf(" [%d] = %c\n", i, ar[i]); } free(ar); } }2) Asigne espacio para la matriz en la pila de la persona que llama y deje que la función llamada la complete:
#define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0])) /* Returns the number of items populated, or -1 if not enough space */ int give_me_some_chars(char *arr, int arr_len) { if (arr_len < 2) return -1; arr[0] = 'c'; arr[1] = 'a'; return 2; } void test(void) { char ar[2]; int num_items; num_items = give_me_some_chars(ar, ARRAY_LEN(ar)); printf("Array:\n"); for (i=0; i<num_items; i++) { printf(" [%d] = %c\n", i, ar[i]); } }NO INTENTE HACER ESTO
char* bad_bad_bad_bad(void) { char result[2]; /* This is allocated on the stack of this function and is no longer valid after this function returns */ result[0] = 'c'; result[1] = 'a'; return result; /* BAD! */ } void test(void) { char *arr = bad_bad_bad_bad(); /* arr is an invalid pointer! */ }Puede devolver un puntero para la matriz desde una función; sin embargo, no puede devolver punteros a matrices locales, la referencia se perderá.
Así que tienes 3 opciones:
Utilice una variable global:
char arr[2]; char * my_func(void){ arr[0] = 'c'; arr[1] = 'a'; return arr; }Use la asignación dinámica (la persona que llama tendrá la responsabilidad de liberar el puntero después de usarlo; aclare eso en su documentación)
char * my_func(void){ char *arr; arr = malloc(2); arr[0] = 'c'; arr[1] = 'a'; return arr; }Haga que la persona que llama asigne la matriz y la use como referencia (mi recomendación)
void my_func(char * arr){ arr[0] = 'c'; arr[1] = 'a'; }Si realmente necesita la función para devolver la matriz, puede devolver la misma referencia que:
char * my_func(char * arr){ arr[0] = 'c'; arr[1] = 'a'; return arr; }Dado que tiene un tamaño predeterminado de su matriz, de hecho puede devolver la matriz si la envuelve con una estructura:
struct wrap { char a[2] ; } ; struct wrap Get( void ) { struct wrap w = { 0 } ; wa[0] = 'c'; wa[1] = 'a'; return w ; }