PDA

Visualizza la versione completa : [C] Verifica esercizio con array dinamico


_d4vid3_
23-02-2011, 13:46
Buongiorno,
visto che sono all'inizio con i programmi che contemplino la allocazione dinamica della memoria vorrei sapere se, secondo voi,il programma seguente è corretto, e se risponde effettivamente a quanto chiesto dall'esercizio (non ho la soluzione):


/*Scrivere un sottoprogramma che riceve come parametro una stringa. Il sotto-
programma alloca un'area di memoria della dimensione strettamente necessaria
a contenere la stringa stessa, copia la stringa ricevuta in ingresso all'interno di
tale area e la restituisce al chiamante.
Scrivere un programma che chiede all'utente una stringa di massimo 50 carat-
teri. Il programma richiama il sottoprogramma precedentemente de nito, e
stampa la stringa da esso restituita e, prima di terminare, dealloca la memoria
allocata dinamicamente.*/
#include<stdio.h>
#include<stdlib.h>
typedef char *pointertype;
pointertype p;
pointertype f(char *a,int MAX);
int cont;

void main()
{int MAX=50;
char a[MAX];
int i,size;
printf("inserire stringa: ");
fgets(a,50,stdin);
cont=0;
for(i=0;i<MAX;i++)
{if(a[i]!='\n') cont++;
else break;}
p=f(a,MAX);
size=sizeof(p);
printf("Dimensione della allocazione: %d\n",size);
printf("Stringa:%s\n\n",p);
free(p);
p=NULL;
system("PAUSE");}

pointertype f(char *a,int MAX)
{int i;
typedef char *pointertype;
pointertype ris;
ris=(char*)malloc(sizeof(char)*(cont+1));
for(i=0;i<cont;i++)
ris[i]=a[i];
ris[cont]='\0';
return(ris);}


la cosa che non capisco, in particolare, è il fatto che come dimensione allocata mi restituisce sempre 4 :confused: , indipendentemente dalla stringa che digito...

grazie.

_Alfabetagamma_
23-02-2011, 16:43
Allora per il sottoprogramma direi che è limitato. Infatti se non riceve "cont" (che tu hai dichiarato come variabile esterna) non funziona.

Per sopperire a questa mancanza ti consiglio di aggiungere


#include <string.h>

e a questo punto fare questo:




void copiastringa(char* stringa)
{
int len, i;
len=strlen(stringa) /* questo comando ti dice la lunghezza esatta della stringa*/

char* risultato;
risultato=(char*)malloc(sizeof(char)*len);

for(i=0; i<len; i++)
*(risultato+i)=*(a+i);


return risultato;
}


In questo modo qualsiasi lunghezza abbia la stringa la legge.

Ora per il main suggerirei di fare una define


#define MAX 50

In modo tale che MAX non sia modificabile e diventerebbe molto più semplice:




char a[MAX];

printf("Inserisci una stringa: ");
scanf("%s", a); /* se vuoi mettere anche spazi devi scrivere scanf("%[^\n]", a);*/

_d4vid3_
23-02-2011, 20:17
ciao! grazie dei suggerimenti.
quindi se ho capito bene il fatto che il

sizeof(p)

restituisce sempre 4 è perchè il sottoprogramma vede scorrettamente cont??
a cosa puo' essere dovuto??

_Alfabetagamma_
23-02-2011, 23:15
No quello che ti ho detto è che se uno ti chiede di "copiare una stringa che non sai quanto è lunga" e tu crei un codice che passa alla tua funzione cont, che guarda caso è la lunghezza della stringa, non rispondi alla richiesta che ti è stata fatta.

Per giunta se tu dovessi scrivere solo una funzione (ipotizzando che il main sia dato) non potresti avere un cont da utilizzare e quindi la tua funzione sarebbe da revisionare.

In conclusione essendo p un puntatore quando tu fai sizeof(p), gli chiedi:

"Quanto spazio occupi per tenere un puntatore?"

E lui ti risponde 4! Se gli metti una stringa più grande e gli chiedi quanto spazio occupa per tenere il puntatore alla prima casella, ti risponderà sempre 4.

_d4vid3_
24-02-2011, 10:34
Ok..Io pensavo che sizeof(p) mi dovesse restituire la dimensione complessiva dell'array visto il legame che esiste tra array e puntatori...
Grazie!

Loading