2011-05-26 3 views
0

Je veux initialiser tableau de c-strings avec zéro pointeurs dans MSVC2010Comment initialiser tableau c-strings (pas stl)

// Foo.h 
#pragma once 
class Foo { 
    int sz_; 
    char **arr_; 
public: 
    Foo(); 
    ~Foo(); 
    // ... some other functions 
}; 

// Foo.cpp 
#include "Foo.h" 
#define INITIAL_SZ 20 

Foo::Foo() : sz_(INITIAL_SZ) { 
    // there I have to initialize arr_ (dynamic array and can be enlarged later) 
    arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *)); // ??? 
    // or maybe arr_ = new ... 
} 

Comment corriger initialiser arr_? Je n'étais pas autorisé à utiliser de STL, MFC, etc.

+0

Juste curieux. Pourquoi pas de STL? Et aussi qu'avez-vous essayé jusqu'à présent? En fait ce que vous avez là 'calloc()' initialisera tout à zéros (NULL). – yasouser

+4

Si ce n'était pas pour le bit 'class', j'aurais tagué ce C ... –

+0

@Matthiew - Moi aussi :) – Loom

Répondre

5

arr = new char*[INITIAL_SZ](); fera - vous pouvez même le mettre dans une liste d'initialisation.

1
arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *)); 

devrait être

arr_ = (char **)calloc(INITIAL_SZ, sizeof (char *));

4

Si vous voulez vraiment éviter STL, etc., alors pourquoi pas:

arr_ = new char*[INITIAL_SZ](); 

Vous pouvez même mettre cela dans la liste initialiseur.

N'oubliez pas d'appeler delete [] arr_ dans votre destructeur. (Comme @Nawaz indique ci-dessous, vous devez suivre probablement aussi la règle de trois, et de définir une appropriée copie constructeur et opérateur d'affectation ainsi.)

+2

Je ne pense pas qu'il les initialise à zéro, le fait-il? (Je ne suis pas tout à fait sûr des règles d'initialisation, mais je pense que les parenthèses supplémentaires sont nécessaires) –

+0

Et aussi définir copy-ctor et l'opérateur d'affectation: règle de trois! – Nawaz

+0

@Alex: vous avez raison. Je vais mettre à jour ... –

1

La manière correcte est de redéfinir arr_ comme std::vector<std::string> et d'utiliser vector::reserve() à indice sur le nombre de chaînes que vous vous attendez à avoir. Laissez C++ prendre soin de la mémoire pour vous.

Mais si vous must utiliser des chaînes C brutes, vous voulez probablement:

arr_ = new char *[sz_]; 
2

1. Construire une classe de chaîne appropriée

2. Construire une classe de tableau appropriée

3. Utilisez le tableau sur les chaînes

Bonne poursuite des fuites de mémoire, des doubles frees et de la corruption de la mémoire.

+0

Oui, sauf que vous n'avez pas répondu à sa question. "Je n'avais pas le droit d'utiliser STL, MFC, etc." De toute évidence, il suit certaines lignes directrices spécifiques, de sorte que votre réponse est complètement inutile, sinon un peu coincé. – leetNightshade

+1

@leetNightshade: il est définitivement bloqué, et signifiait comme une provocation. Cependant, ne pas utiliser STL ou MFC ne signifie pas que vous ne pouvez pas créer vos propres classes pour la gestion de la mémoire. Ma réponse suggère simplement de décomposer le problème (String + Array) au lieu d'essayer de le résoudre à la fois. Et je sais que les cours seront imparfaits, les experts se trompent. –

+0

M .: +1 Bien dit. :) – leetNightshade