Ridimensionamento di un char[] a tempo di esecuzione

Ho bisogno di ridimensionare una char array[size] per char array[new_size] in fase di runtime.

Come posso fare questo?

Si desidera ridimensionare un staticamente allocato char[]?
No non e ‘ lui, è solo una visualizzazione della matrice di dimensioni 😉
Puoi mostrarci qualche tuo codice per favore?

OriginaleL’autore HoNgOuRu | 2009-08-30

6 risposte

  1. 18

    Se si utilizza std::vector<char> piuttosto che gli array, quindi la funzione desiderata non sarebbe solo un altro metodo per il tipo.

    OriginaleL’autore Steve Gilham

  2. 6

    assumendo char array[size] era malloc‘ed….è possibile utilizzare realloc

    esempio (tratto da OpenBSD pagina man):

    newsize = size + 50;
    if ((newp = realloc(p, newsize)) == NULL) {
       free(p);
       p = NULL;
       size = 0;
       return (NULL);
    }
    p = newp;
    size = newsize;
    Ew. [15 caratteri]
    che è molto standard, anche idomatic. Voglio dire, std::vector fa o qualcosa di equivalente, basta non avere per guardare, e se la codifica a mano, si sarebbe ben consigliato di avvolgere troppo.
    Di corso. È più astratto in un vettore. Un vettore chiama un allocatore, e che allocatore in grado di fare ciò di cui ha bisogno.
    Anche se disponibile in C++, malloc non è il modo standard di allocazione di memoria in C++. Se l’interrogante chiedeva su C, allora questa sarebbe una risposta valida, ma l’interrogante chiede sul C++.
    Sì, utilizzando un contenitore STL come vettore dovrebbe essere utilizzato, ma non è quello che ha chiesto. Leggere la domanda nel suo post.

    OriginaleL’autore Los

  3. 2

    È necessario allocare un nuovo array e copiare il contenuto di un array esistente. Non si può semplicemente fare l’array esistente più grande

    Devo dichiarare l’array di char[] nell’intestazione della classe, ma ho bisogno di costruire secondo la lunghezza di una parola, sto facendo il blocco di gioco…
    mettere questo nella tua domanda – è importante.

    OriginaleL’autore Matt

  4. 2

    Qualcosa di simile a questo:

    class HangUpGame {
        char *palabra;
        size_t palabra_size;
    
        public:
            HangUpGame(){
                palabra = new char[DEFAULT_SIZE];
                palabra_size = DEFAULT_SIZE;
            }
            virtual ~HangUpGame(){
                delete [] palabra;
            }
    
            void Resize(size_t newSize){
                //Allocate new array and copy in data
                char *newArray = new char[newSize];
                memcpy(newArray, palabra, palabra_size);
    
                //Delete old array
                delete [] palabra;
    
                //Swap pointers and new size
                palabra = newArray;
                palabra_size = newSize;
            }
    };

    In risposta ai commenti di altre risposte, il modo migliore per fare questo, in realtà, sarebbe usare un contenitore STL. Ma comunque, se si preferisce utilizzare un array, è abbastanza facile swap la matrice corrente con una più grande (all’interno i contenitori STL esattamente che farà comunque).

    Si può migliorare la vostra risposta in modo che davvero compila per favore?
    Beh, la versione prima non compilare… a seconda di dove è stato scritto. Comunque, il nuovo codice viene compilato bene e dovrebbe funzionare correttamente.
    Questo codice ha diversi bug di rilievo. Si prega di cercare la copia superficiale problema. Si prega di leggere questo per le correzioni che hai bisogno di: stackoverflow.com/questions/255612/…

    OriginaleL’autore LorenzCK

  5. 0

    Eliminare la vecchia matrice, e quindi allocare uno nuovo:

    char* array = (char*)malloc(sizeof(char) * number_of_chars_in_word);
    grazie per tutte le risposte, ma il mio problema è che non riesco a cambiare il nome di matrice causa definita in oggetto, devo definire con una dimensione, ma non ce l’ho prima di caricare una parola, e questo accade nel costruttore. nella definizione della classe che ho, stringa palabra; char palocu[size_of_palabra]; (ma a questo punto non ho size_of_palabra, causa sarà caricato nel costruttore, che è il mio problema…ho bisogno di questo, perchè ho l’accesso “palocu” in un secondo tempo dalla classe principale…
    Come abbiamo detto, utilizzare un std::vector.
    Si prega di mostrare il codice. Probabilmente si può ottenere via con un char* palocu; membro che è newed il costruttore e deleted nel distruttore. Ma potrebbe essere ancora meglio con std::vector.

    OriginaleL’autore Cecil Has a Name

  6. 0

    ok, grazie per tutte le risposte, ho risolto il mio problema con la creazione di un nuovo spazio per il nuovo array di char throwght un puntatore…
    grazie

    No, No, No. Utilizzare un std::vector. Perché fare altrimenti? Stai reinventando la ruota, e sarà probabilmente buggy.
    Sì, e probabilmente una perdita di memoria.
    …o forse una std::string?
    Non compiti a casa, vero?
    Utilizzando un STD contenitore come vettore sarebbe l’ideale, a meno che la sua struttura di dati è esposto attraverso un lib (cioè…un programma in C bisogno). Solo perché lui usa un puntatore char array non significa che sarà una perdita di memoria (come tutti i casi considerati). @Cecil Ha un Nome: Questo è meglio non essere alcuni bambini di alta scuola e compiti a casa. 😉

    OriginaleL’autore HoNgOuRu

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *