2013-02-19 6 views
10

Sto chiamando strdup e devo allocare spazio per la variabile prima di chiamare strdup.Come si usa strdup?

char *variable; 
variable = (char*) malloc(sizeof(char*)); 
variable = strdup(word); 

Sto facendo bene? O c'è qualcosa di sbagliato qui?

risposta

17

Se si utilizza lo standard POSIX strdup(), calcola lo spazio necessario e lo alloca e copia la stringa di origine nello spazio appena assegnato. Non è necessario eseguire personalmente lo malloc(); infatti, perde immediatamente se lo fai poiché sovrascrivi il solo puntatore allo spazio che hai assegnato con il puntatore allo spazio assegnato a strdup().

Quindi:

char *variable = strdup(word); 
if (variable == 0) …process out of memory error; do not continue… 
…use variable… 
free(variable); 

Se si ha bisogno di fare l'allocazione di memoria, quindi è necessario allocare strlen(word)+1 byte variable e quindi è possibile copiare word in quello spazio appena allocata.

char *variable = malloc(strlen(word)+1); 
if (variable == 0) …process out of memory error; do not continue… 
strcpy(variable, word); 
…use variable… 
free(variable); 

o calcolare la lunghezza una volta e utilizza memmove() o forse memcpy():

size_t len = strlen(word) + 1; 
char *variable = malloc(len); 
if (variable == 0) …process out of memory error; do not continue… 
memmove(variable, word, len); 
…use variable… 
free(variable); 

Non dimenticare per essere sicuri di sapere dove il free() è per ogni malloc().

2

Allo stato attuale si perdono sempre da 4 a 8 byte (a seconda dell'architettura). Indipendentemente da strdup che will allocate the required dynamic memory on its own si sta riassegnando l'unica variabile che mantiene il puntatore all'area di memoria appena malloced.

semplicemente dire

char* const variable = strdup(word); 
9

non è necessario per lo spazio di allocazione per l'utilizzo con strdup, strdup lo farà per voi. Comunque dovresti liberarlo dopo l'uso.

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

int main(){ 

    const char* s1= "Hello World"; 
    char* new = strdup (s1); 
    assert (new != NULL); 

    fprintf(stdout , "%s\n", new); 

    free (new); 
    return 0; 
} 

Edit: Fate attenzione con il C++ come il nome della variabile nuova va bene in C e non in C++ dal momento che è un nome riservato per l'operatore new.

+0

Non si deve usare 'new' come nome della variabile –

+0

@ ale-batt Il nome della variabile è perfettamente bene a C. Tuttavia, posso capisci che il compilatore C++ non gli piace. Questa domanda è contrassegnata come C. Quindi, non vedo un problema. – hetepeperfan

6

Sembri confuso. Dimentica ciò che sai sui puntatori. Lavoriamo con gli ints.

int x; 
x = rand(); // Let us consider this the "old value" of x 
x = getchar(); // Let us consider this the "new value" of x 

C'è un modo per noi di recuperare il vecchio valore o ha "filtrato" dal nostro punto di vista? In via ipotetica, supponiamo che ci si aspettasse che il sistema operativo sappia che hai finito con quel numero casuale, in modo che il sistema operativo possa eseguire alcune operazioni di pulizia.

è il vecchio valore richiesto per la generazione del nuovo valore? Come può essere, quando getchar non può vedere x?

Consideriamo ora il tuo codice:

char *variable; 
variable = (char*) malloc(sizeof(char*)); // Let us consider this the "old value" of variable 
variable = strdup(word);     // Let us consider this the "new value" of variable 

C'è un modo per noi di recuperare il vecchio valore, o ha "rubato" dal nostro punto di vista?Dovresti far sapere al sistema operativo quando hai finito con la memoria malloc, chiamando free(variable);.

è il vecchio valore richiesto per la generazione del nuovo valore? Come può essere, quando strdup non può vedere la variabile?

Cordiali saluti, ecco un esempio di come potrebbe essere implementato strdup:

char *strdup(const char *original) { 
    char *duplicate = malloc(strlen(original) + 1); 
    if (duplicate == NULL) { return NULL; } 

    strcpy(duplicate, original); 
    return duplicate; 
}