Repository 32bit  Forum
Repository 64bit  Wiki

[C] Puntatori passati per valore ? [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 16: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 18:19, modificato 1 volta in totale.
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 1:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggioda lamarozzo » sab gen 05, 2008 16: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: gio lug 14, 2005 0:00
Località: Roma
Desktop: xfce
Distribuzione: archlinux

Re: [C] Puntatori passati per valore ?

Messaggioda Dani » sab gen 05, 2008 17: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 1:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggioda nuitari » sab gen 05, 2008 17: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 12:51
Località: San Colombano al Lambro
Slackware: 12.0

Re: [C] Puntatori passati per valore ?

Messaggioda Dani » sab gen 05, 2008 18: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 1:52
Desktop: gnome
Distribuzione: arch

Re: [C] Puntatori passati per valore ?

Messaggioda gallows » sab gen 05, 2008 18: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: lun set 20, 2004 0:00
Località: Palermo
Kernel: FreeBSD 8.0-RELEASE-p3
Desktop: ratpoison

Re: [C] Puntatori passati per valore ?

Messaggioda Dani » sab gen 05, 2008 18:19

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


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti