Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25

    [C]Verifica esercizio con array dinamico

    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):
    codice:
    /*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 , indipendentemente dalla stringa che digito...

    grazie.

  2. #2
    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

    codice:
    #include <string.h>
    e a questo punto fare questo:

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

    codice:
    #define MAX 50
    In modo tale che MAX non sia modificabile e diventerebbe molto più semplice:

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25
    ciao! grazie dei suggerimenti.
    quindi se ho capito bene il fatto che il
    codice:
    sizeof(p)
    restituisce sempre 4 è perchè il sottoprogramma vede scorrettamente cont??
    a cosa puo' essere dovuto??

  4. #4
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    25
    Ok..Io pensavo che sizeof(p) mi dovesse restituire la dimensione complessiva dell'array visto il legame che esiste tra array e puntatori...
    Grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.