Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [c] allocazione memoria puntatori

    Buongiorno.

    Il mio dubbio è il seguente:
    -dichiarato un puntatore (**ptr) di puntatori a char;
    -allocata memoria per tale puntatore;
    -se io conosco il numero preciso di caratteri che compongono una data stringa, ad esempio ptr[1];
    -quali vantaggi mi comporta allocare nuovamente memoria per tale stringa, specificando stavolta l'esatto numero di caratteri?

    Ve lo chiedo perché ho notato che il compilatore non mi dà errore se provo a scrivere su ptr[1] senza allocare memoria, mentre invece in un programma trovato su un libro, veniva allocata nuovamente la memoria per tale stringa.
    Spero di essere stato chiaro.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Non confondere le due cose:

    **ptr è un puntatore ad un puntatore, o, in modo equivalente, un array di array.

    Perciò, devi prima allocare la memoria per il vettore di vettori, e poi la memoria per ogni vettore dell'array:

    codice:
    ptr = malloc( sizeof(char* ) * n_stringhe );   //ptr è di tipo char**
    
    ptr[0] = malloc (sizeof(char ) * n_caratteri );   //ptr[0] è di tipo char*
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Il problema è che il mio compilatore non segnala errori:
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    int main(){
      char *prova="questa e' una prova";
      char **ptr=(char **)malloc(10*sizeof(char*));
      ptr[2]=prova;       
      printf("%s",ptr[2]);
      return 0;
    }
    Come mai?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Questa riga alloca della memoria (nel segmento dati del programma, non nell'heap)

    codice:
    char *prova="questa e' una prova";
    Questa riga rende ptr[2] un puntatore a quell'area di memoria.

    codice:
    ptr[2]=prova;
    Ricordati che i puntatori possono puntare a qualsiasi area di memoria, indipendentemente da chi e come l'abbia allocata. Anzi, in realtà possono puntare anche a della memoria non allocata, creando grossi casini.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da franzSPECIAL
    Il problema è che il mio compilatore non segnala errori:
    codice:
      char **ptr=(char **)malloc(10*sizeof(char*));
    Come mai?
    Tu stati semplicemente ordinando al tuo compilatore di riservare nella memoria del Data Segment del tuo programma all'indirizzo dell'indirizzo dell'elemento char uno spazio di dieci volte la dimensione di un indirizzo di memoria (non la dimensione dell'elemento a cui l'indirizzo punta), e lui semplicemente lo fa.
    In quello spazio volendo ci possono stare dieci indirizzi di memoria (dieci puntatori) ma tu avrai inizializzato solo il primo.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.