2012-03-01 5 views
5

Esta es una pregunta para principiantes, pero por favor tengan paciencia conmigo. Me gustaría pasar un carácter * a una función y llenarla con el contenido de varias cadenas existentes. Aquí es lo que tengo (y no funciona)Populate C parámetro de salida

int func(char *out) { 
    int i; 
    int x = 10; 
    int y = 10; 
    char array[x][y]; 

    out = malloc(x * y + x); 
    memset(out, 0x00, strlen(out)); 
    for (i=0; i<x; i++) { 
      strcat(out, array[i]); 
      strcat(out, "\n"); 
    } 
} 

//main 
    char *result; 
    func(result); 
+1

Por favor muestre su código real - este ejemplo ni siquiera compilará. –

+0

Debería compilar ahora, gracias. –

+2

¡No puede usar 'strlen (out)'! Lea lo que 'strlen' hace (o cómo funcionan las cadenas C, para el caso). En su lugar, debe decir 'x * y + x'. Y asegúrese de que cada 'matriz [i]' tenga terminación nula. –

Respuesta

8

A char* es solo un puntero, al pasarlo no le permite volver a pasar uno nuevo. Tiene que pasar un char** así:

void get_name(char** ppname){ 
    char * pname = strdup("my name is fred"); 
    *ppname = pname; 
} 

A continuación, la función de alimentar a un lugar para poner el puntero de este modo:

char * name; 
get_name(&name); 
printf("got '%s'\n", name); 
free(name); 
+0

Eso funciona bien. Por qué esto no funciona: out = (char *) malloc (1000); strcat ((* out), someString); –

+0

@RobertVbr, que probablemente no funciona en tu func original porque pasas memoria no inicializada, strcat puede nunca encontrar un terminador NUL para comenzar a anexar después. – IanNorton

+0

Entendido, gracias. –

0

No funciona porque nunca se asigna memoria para la variable de result - es sólo un puntero que apunta a ninguna parte.

char result[1000]; // change size as needed if you know the size ahead of time 
func(result); 

o

char *pResult = malloc (1000); // allocate dynamically 

if (pResult != NULL) 
    func (pResult); 

... 

if (pResult != NULL) 
    free (pResult); 

También debe pasar en el tamaño de su memoria intermedia por lo que su función func puede comprobar y verificar que hay suficiente espacio disponible para su producción.

Ambas soluciones suponen que usted asigna su memoria intermedia fuera de func. Si desea asignar el búfer de salida dentro de func que, como sugiere Als, debe pasar un puntero a puntero. En ese caso, también debe devolver el tamaño del búfer para que el llamante sepa cuántos bytes están disponibles en el búfer.