Repository 32bit  Forum
Repository 64bit  Wiki

[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.

[C] Puntatori passati per valore ? [risolto]

Messaggioda Dani » sab gen 05, 2008 15:23

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 gen 05, 2008 17:19, modificato 1 volta in totale.
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggioda lamarozzo » sab gen 05, 2008 15:29

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(...);
Avatar utente
lamarozzo
Linux 2.6
Linux 2.6
 
Messaggi: 732
Iscritto il: mer lug 13, 2005 23:00
Località: Roma
Desktop: xfce
Distribuzione: archlinux

Re: [C] Puntatori passati per valore ?

Messaggioda Dani » sab gen 05, 2008 16:43

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:
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggioda nuitari » sab gen 05, 2008 16:58

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;
}
Avatar utente
nuitari
Linux 2.6
Linux 2.6
 
Messaggi: 777
Iscritto il: dom ott 14, 2007 11:51
Località: San Colombano al Lambro
Slackware: 12.0

Re: [C] Puntatori passati per valore ?

Messaggioda Dani » sab gen 05, 2008 17:07

No intendo nella funzione in cui ho allocato la memoria !
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggioda gallows » sab gen 05, 2008 17:08

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';  */
}
Avatar utente
gallows
Staff
Staff
 
Messaggi: 3466
Iscritto il: dom set 19, 2004 23:00
Località: Palermo
Kernel: FreeBSD 8.0-RELEASE-p3
Desktop: ratpoison

Re: [C] Puntatori passati per valore ?

Messaggioda Dani » sab gen 05, 2008 17:19

Perfetto :)
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron