2016-03-27 1 views
1

Ich stehe einige Probleme mit Code für meine Schule. Das Problem ist, dass ich ein char Zeiger „contenido“ wie folgt benannt:Wie char * in C++ - Klasse zu initialisieren? (sizeof() gibt immer 8)

class Archivo { 
public: 
    Archivo(const char *filename, int banderas); 
    Archivo(const char *filename, int banderas, mode_t modo); 
    ~Archivo(); 
    size_t lee(size_t nbytes); 
    size_t escribe(const void *buffer, size_t nbytes); 
    char *get_contenido(); 
    void cerrar(); 

protected: 
    string nombreArchivo; 
    int fd; 

    //Problematic char pointer 
    char *contenido; 
}; 

Der Code soll eine Klasse Umsetzung der c-Funktionen read(), write() und open(), die spezifische Methode sein, wo ich muss eingestellt eine neue Größe für meinen char-Pointer ist size_t lee(size_t nbytes);, die ich wie folgt umgesetzt:

size_t Archivo::lee(size_t nbytes) { 
    contenido = new char[nbytes]; 
    cout << "contenido: " << sizeof(contenido) << endl; 
    nbytes = read(fd, contenido, sizeof(contenido)); 
    return nbytes; 
} 

in diesem Verfahren soll ich eine neue Größe für „contenido“ erhalten, dass in diesem Fall auch funktioniert es als meine Puffer für die read() aber leider spielt es keine Rolle, welchen Wert ich immer benutze ns "8" im Ruf von sizeof(contenido). Ich habe versucht, malloc() im Konstruktor zu verwenden, malloc() und dann verwendend, und wie Sie mit new char[size_t] sehen können, aber in jedem einzelnen Fall erhalte ich das gleiche Ergebnis von "8". Ich recherchierte darüber und in den meisten Fällen wurde vorgeschlagen, std :: vector zu verwenden, aber in diesem speziellen Fall ist es notwendig, char * aufgrund der Anfrage meines Professors zu verwenden. Ich hoffe du kannst mir helfen und danke im voraus.

+1

Sie sagen, C++ in Ihrem Titel, so wenden Sie sich bitte C-Tag entfernen. – jdarthenay

+4

Sizeof tut, was es tun sollte: Rückgabe der Zeigergröße, nicht der Datengröße. Für die Datengröße haben Sie Ihre eigene Variable 'nbytes'. – deviantfan

+1

'contenido' ist ein Zeiger und' sizeof (contenido) 'gibt immer Zeiger Größe. – haccks

Antwort

0

Sie rufen den sizeof() Operator auf einen Zeiger, daher erhalten Sie die Größe des Zeigers und nicht die Größe von Inhalten es zeigt. Der Zeiger im Speicher ist normalerweise wie eine andere reguläre Variable (zum Beispiel int), außer dass er eine Adresse anstelle eines tatsächlichen Werts enthält. Sie erhalten immer die Zahl 8 wahrscheinlich, weil Ihre Maschine 64 Bit ist, so sollte ein Zeiger in der Lage sein, jede Adresse im 64-Bit-Bereich zu halten. (8 Bytes = 64 Bit)

Wenn Sie die Größe in Bytes des Inhalts (der Speicher, den Sie zugewiesen haben) erhalten möchten, sollten Sie die Größe von char (der Typ, aus dem der Inhalt besteht) mit sizeof() und dann multiplizieren, dass durch die Anzahl der Zeichen zugeordnet, etwa so:

sizeof(char)*nbytes

+0

Meine schlechte, ich habe nicht erkannt, dass es mir den Wert des Zeigers und nicht des vollen Speicherplatzes gegeben hat, jetzt funktioniert wie beabsichtigt und es ist mir klarer die Ergebnisse, danke an alle! –

+0

@UnTraDe: 'sizeof (char)' ist immer 1, per Definition (auch wenn diese 1 nicht 8 Bit bedeutet, ist es immer noch 1). Die Multiplikation ist nicht notwendig. – deviantfan

+0

@deviantfan Es war mehr beabsichtigt, den Unterschied zwischen der Größe des zugewiesenen Typs und dem Zeiger selbst zu erklären – UnTraDe

1

sizeof(contenido) wertet die Größe eines Zeigers aus, der auf Ihrer Plattform 8 ist.

Um den Inhalt einer Zeichenfolge wiederherzustellen, müssen Sie die Länge der Zeichenfolge als Argument für read verwenden.

size_t Archivo::lee(size_t nbytes) { 
    contenido = new char[nbytes]; 
    cout << "contenido: " << sizeof(contenido) << endl; 
    nbytes = read(fd, contenido, nbytes); 
    return nbytes; 
} 

Wenn contenido soll ein Null-terminierten String sein, müssen Sie wahrscheinlich noch ein Byte für sie zuzuordnen und sicherstellen, dass das abschließende Nullzeichen hinzuzufügen.

size_t Archivo::lee(size_t nbytes) { 
    contenido = new char[nbytes+1]; 
    cout << "contenido: " << sizeof(contenido) << endl; 
    nbytes = read(fd, contenido, nbytpes); 
    contenido[nbytes] = '\0'; 
    return nbytes; 
}