Progtwig C que devuelve la matriz

Estoy trabajando en un progtwig muy básico donde quiero devolver una matriz entera de longitud 2 a mi bloque principal. Sin embargo, no puedo hacer que funcione, y me dijeron que podría necesitar sugerencias para hacer esto. ¿Cómo funcionan los punteros y cómo puedo usar esto en mi progtwig? Aquí está mi código actual:

int[] return2(); int main() { int a[2]; a = request(); printf("%d%d\n", a[0], a[1]); return(0); } int[] request () { int a[2]; a[0] = -1; a[1] = 8; return a; } 

  • No puedes declarar una función devolviendo una matriz.

    ISO / IEC 9899: 1999

    §6.9.1 Definiciones de funciones

    ¶3 El tipo de retorno de una función será void o un tipo de objeto distinto del tipo de matriz.

    C2011 dirá esencialmente lo mismo.

  • Nunca debe devolver un puntero a una variable local (no estática) desde una función, ya que ya no está en el scope (y, por lo tanto, no es válido) tan pronto como se complete la devolución.

Puede devolver un puntero al inicio de una matriz si la matriz está asignada estáticamente, o si se asigna dinámicamente a través de malloc() et al.

 int *function1(void) { static int a[2] = { -1, +1 }; return a; } static int b[2] = { -1, +1 }; int *function2(void) { return b; } /* The caller must free the pointer returned by function3() */ int *function3(void) { int *c = malloc(2 * sizeof(*c)); c[0] = -1; c[1] = +1; return c; } 

O, si te sientes aventurero, puedes devolver un puntero a una matriz:

 /* The caller must free the pointer returned by function4() */ int (*function4(void))[2] { int (*d)[2] = malloc(sizeof(*d)); (*d)[0] = -1; (*d)[1] = +1; return d; } 

¡Cuidado con esa statement de función! No hace falta mucho cambio para cambiar su significado por completo:

 int (*function4(void))[2]; // Function returning pointer to array of two int int (*function5[2])(void); // Array of two pointers to functions returning int int (*function6(void)[2]); // Illegal: function returning array of two pointers to int int *function7(void)[2]; // Illegal: function returning array of two pointers to int 

Es mejor que entiendas cómo funciona el puntero. Aquí hay una (mala) solución:

 #include  int* request(){ int a[2]; a[0] = -1; a[1] = 8; return a; } int main() { int* a; a = request(); printf("%d%d\n", a[0], a[1]); return 0; } 

pero hay un problema. ya que int a[2]; in int* request() es una variable local, no hay garantía de que el valor devuelto no se sobrescriba. Aquí hay una mejor solución:

 #include  void request(int* a){ a[0] = -1; a[1] = 8; } int main() { int a[2]; request(a); printf("%d %d\n", a[0], a[1]); return 0; } 

Tienes que devolver el pointer to array of 2 integers desde la función. #incluir

 int(* request()) [2] { static int a[2]; a[0] = -1; a[1] = 8; return &a; } int main() { int (*a) [2]; a = request(); printf("%d%d\n", *(*a+0), *(*a+1)); return 0; } 

La matriz int a[2] que usted declara en la request solo es válida durante el scope de esa función, por lo que devolverla así no funciona, ya que una vez que main hace cargo de ella, la matriz ya no es válida.

Si no entiendes los punteros, tendrás que entender lo que está pasando, pero aquí hay un código que hará lo que quieras:

 int* request(); int main() { int* a; // a is a pointer to an int a = request(); printf("%d%d\n", a[0], a[1]); // we have to tell the program that we're done with the array now free(a); return(0); } int* request () { // allocate space for 2 ints -- this space will survive after the function returns int* a = malloc(sizeof(int) * 2);/ a[0] = -1; a[1] = 8; return a; } 

Puede hacer lo que otros sugieren y asignar memoria a través de malloc para devolver un puntero. También debes considerar algo como lo siguiente:

 struct values { int val1; int val2; }; struct values request(); int main() { struct values a; a = request(); printf("%d%d\n", a.val1, a.val2); return(0); } struct values request () { struct values vals; vals.val1 = -1; vals.val2 = 8; return vals; } 

Las estructuras se pasan y se devuelven por valor (lo que significa que se copian) y, a veces, pueden ser más fáciles y seguras, dependiendo del tipo de datos contenidos dentro de las estructuras.

Para devolver la matriz, debe asignarla dinámicamente.

Intente esto en su lugar (Observe los cambios):

 int* request(); int main() { int *a; a = (int *)request(); printf("%d %d\n", a[0], a[1]); return(0); } int* request() { int *a = malloc(sizeof(int) * 2); a[0] = -1; a[1] = 8; return a; }