[C] Puntatori passati per valore ? [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

[C] Puntatori passati per valore ? [risolto]

Messaggio 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 ?
Ultima modifica di Dani il sab 5 gen 2008, 17:19, modificato 1 volta in totale.

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

Re: [C] Puntatori passati per valore ?

Messaggio 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(...);

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggio 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:

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: [C] Puntatori passati per valore ?

Messaggio 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;
}

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggio da Dani »

No intendo nella funzione in cui ho allocato la memoria !

Avatar utente
gallows
Staff
Staff
Messaggi: 3470
Iscritto il: lun 20 set 2004, 0:00
Slackware: 64-current
Kernel: 5.10.7
Località: ~/
Contatta:

Re: [C] Puntatori passati per valore ?

Messaggio 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';  */
}

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggio da Dani »

Perfetto :)

Rispondi