2012-04-03 15 views
5

tengo la siguiente función en C:Función con arreglo tipo de retorno en C

int[] function(int a){ 
    int * var = (int*)malloc(sizeof(int)*tags); 
    .... 
} 

*var es un puntero a una matriz var?

En caso afirmativo, ¿cómo puedo devolver la matriz (var) en la función?

+3

Nota sobre la buena práctica de C: las sentencias Malloc deben ser 'T * var = malloc (sizeof (* var) * NUM);', también se considera una buena práctica para asignar memoria por el que llama, en lugar del destinatario . – Matt

Respuesta

12

Realmente no se puede devolver una matriz desde una función, sino un puntero:

int * function(int a){ 
    int * var = malloc(sizeof(int)*tags); 
    //.... 
    return var; 
} 
+0

Error de copiar y pegar. Gracias :) – MByD

-2

En C una matriz es básicamente el mismo tipo que un puntero a un elemento de la matriz. Así que char [] es básicamente char *

No se olvide de hacer un seguimiento del tamaño de la matriz, también noté que las etiquetas parecen ser una variable global, la mayoría de las veces es una buena idea evitar global las variables

Aquí es un código de ejemplo:

#include <stdio.h> 
#include <stdlib.h> 

int* foo(size_t arrSize){ 
    int* arr = (int*) malloc(sizeof(int)*arrSize); 
    return arr; 
} 


int main (int argc, char** argv){ 
    printf("Printing array:\n"); 
    int* arr = foo(42); 
    for(int i=0; i <42; i++){ 
     arr[i]=i; 
    } 

    for (int i=0; i < 42; i++){ 
     printf("Element: %d: %d\n", i, arr[i]); 
    } 
    free(arr); 
    return 0; 
} 
+2

"En C, una matriz es básicamente del mismo tipo que un puntero a un elemento de la matriz" - esto es simplista hasta el punto de ser incorrecta. Una matriz no es lo mismo que un puntero, y una matriz * expresión * no es lo mismo que una expresión de puntero. Una expresión de matriz siempre tendrá un tipo de matriz; sin embargo, en la mayoría de las circunstancias, una expresión de matriz será * reemplazada * con una expresión de puntero que apunta al primer elemento de la matriz. 'char []' y 'char *' son solo los mismos en el contexto de una declaración de parámetro de función, no en ningún otro lado. –

0

¿Qué tal:

int* function(int tags){ 
    int * var = malloc(sizeof(int)*tags); 
    //.... 
    return var; 
} 

Arrays y punteros al tipo de elemento de base son (en su mayoría) en C/C++, por lo que puede devolver un puntero al primer elemento de una matriz y utilizarlo como si fuera la matriz en sí.

Nota: su código tiene un parámetro de entrada a, pero usa tags para asignar la memoria para la matriz. Supuse en el código anterior que quería usar el parámetro de entrada para ese propósito

Además, tendrá que llamar al free() en el puntero devuelto por function arriba, cuando ya no esté usando la matriz, para evitar fugas de memoria . malloc anterior asigna memoria suficiente para almacenar tags número de int s, por lo que la matriz es equivalente a int var[tags];

ACTUALIZACIÓN: elenco eliminado malloc 's retorno

+0

gracias, actualizado – Attila

1

Este código de abajo podría aclarar una matriz y punteros bits cómo funciona. La función asignará memoria para variables int "tags", luego inicializará cada elemento con un número y devolverá el segmento de memoria que apunta a la matriz. Desde la función principal, realizaremos un ciclo e imprimiremos el elemento de matriz, luego liberaremos la memoria que ya no necesitamos.

#include <stdio.h> 
#include <stdlib.h> 

int *function(unsigned int tags) { 
     int i; 
     int *var = malloc(sizeof(int)*tags); 

     for (i=0; i < tags; i++) { 
       var[i] = i; 
     } 

     return var; 
} 

int main() { 
     int *x; 
     int i; 

     x = function(10); 
     for (i=0; i < 10; i++) { 
       printf("TEST: %i\n", x[i]); 
     } 

     free(x); x=NULL; 

     return 0; 
} 
0

En C, las funciones no pueden devolver los tipos de matriz. Para sus propósitos, que desea devolver un puntero a int:

int *function(int a) 
{ 
    int *var = malloc(sizeof *var * tags); // where is tags defined? 
             // are you sure you don't mean a here? 
    ... 
    return var; 
} 

Esto le asignará un bloque de memoria lo suficientemente grande como para contener tags valores enteros y asigne la dirección del primer elemento de ese bloque a var. Tenga en cuenta que var es un puntero a int, no un puntero a una matriz de int. Ese puntero es lo que se devuelve de la función.

se puede utilizar el oprerator subíndice en una expresión puntero como si fuera un array, así:

int a = ...; 
int *arr = function(a); 
... 
arr[0] = 0; 
arr[1] = 1; 
... 

arr es una expresión de puntero, no una expresión de matriz, por lo sizeof arr devolverá el tamaño del tipo de puntero, no del tamaño del bloque de memoria al que apunta (debido a esto, querrá hacer un seguimiento del número de elementos que asignó por separado).

Cuestiones relacionadas