Pagina 1 di 1

[C] Puntatori passati per valore ? [risolto]

Inviato: sab gen 05, 2008 15:23
da Dani
E' da un po' che cerco di capire a cos'è dovuta quella che io vedo come un'anomalia, quindi provvedo subito ad inaugurare la nuova sezione. :D

Ho un puntatore a char che passo ad una funzione. In questa funzione alloco dinamicamente memoria con malloc, assegnando l'indirizzo ottenuto al puntatore passato. Ma all'uscita lo spazio allocato è svanito nel nulla :?:
Mi spiego meglio con un po' di codice.

Nella funzione in cui avviene l'allocamento di memoria ho:

Codice: Seleziona tutto

int mia_funzione (char* p)
{
if ((p = malloc (N, sizeof (char)))== NULL) exit (1);
...
return 0;
}


In main ho:

Codice: Seleziona tutto

char* str;
...
mia_funzione (str);
... /* qui lo spazio appena allocato non è disponibile */


Perchè della memoria allocata nel segmento heap svanisce in questo modo ? Mi sfugge qualcosa ?

Re: [C] Puntatori passati per valore ?

Inviato: sab gen 05, 2008 15:29
da lamarozzo
Ciao,
la risposta è molto semplice. Il puntatore a char viene passato per valore quindi quello che ottieni da malloc non lo vedi al di fuori della funzione. Per aggirare il problema devi passare alla funzione un puntatore a puntatore.

Ad esempio

Codice: Seleziona tutto

void prova(char** c);


e all'interno della funzione fai

Codice: Seleziona tutto

*c=malloc(...);

Re: [C] Puntatori passati per valore ?

Inviato: sab gen 05, 2008 16:43
da Dani
Giusto, è vero :oops: Prima immaginavo l'indirizzo di memoria come un oggetto "assoluto", non consideravo che l'assegnamento sarebbe rimasto locale alla funzione, nello stack, e perso all'uscita della stessa.
Pero' ora mi è sorto un altro dubbio, ovvero come accedo ad ogni cella dell'array ? Se ad esempio nella funzione eseguo un:

Codice: Seleziona tutto

...
i=0;
while (i<size){
**(p+i) = 'A';
i++;
}

Va in segfault :roll:

Re: [C] Puntatori passati per valore ?

Inviato: sab gen 05, 2008 16:58
da nuitari
Come ci accedi normalmente...

Codice: Seleziona tutto

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

int myfunc(char **p)
{
        *p = (char *)malloc(sizeof(char) * 10);
        return 0;
}

int main(void)
{
        char *str;
        myfunc(&str);
        str[0] = 'a';
        str[1] = 'b';
        str[2] = 'c';
        str[3] = 0;
        printf("%s\n", str);
        return 0;
}

Re: [C] Puntatori passati per valore ?

Inviato: sab gen 05, 2008 17:07
da Dani
No intendo nella funzione in cui ho allocato la memoria !

Re: [C] Puntatori passati per valore ?

Inviato: sab gen 05, 2008 17:08
da gallows
Nella funzione ti devi comportare come segue:

Codice: Seleziona tutto

void f(char** s, size_t sz)
{
    int i;

    *s = malloc(sz);

    for (i=0; i<sz; i++)
        (*s)[i] = 'a';
        /* o se preferisci  *(*s+i) = 'a';  */
}

Re: [C] Puntatori passati per valore ?

Inviato: sab gen 05, 2008 17:19
da Dani
Perfetto :)