2011-05-26 64 views
0

我想在MSVC2010如何初始化C字符串數組(不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 ... 
} 

零個指針初始化C-字符串數組如何正確初始化arr_?我沒有被允許使用STL,MFC等。

+0

只是好奇。爲什麼沒有STL?還有你到目前爲止嘗試過什麼?其實你在那裏'calloc()'會將所有東西初始化爲零(NULL)。 – yasouser 2011-05-26 17:38:46

+4

如果不是'class'位,我會標記這個C ... – 2011-05-26 17:39:11

+0

@Matthiew - 我也是:) – Loom 2011-05-26 17:54:31

回答

5

arr = new char*[INITIAL_SZ]();會做 - 你甚至可以把它放在初始化列表中。

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

應該

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

4

如果你真的想避免STL等等,那麼爲什麼不:

arr_ = new char*[INITIAL_SZ](); 

你甚至可以把這個在初始化列表中。

請記住在析構函數中調用delete [] arr_。 (正如下面@Nawaz所指出的,你應該也遵循三個規則,並確定合適的拷貝構造函數和賦值操作爲好。)

+2

我不認爲它將它們初始化爲零,可以? (我並不完全確定初始化規則,但我認爲需要額外的圓括號) – 2011-05-26 17:45:27

+0

還要定義copy-ctor和賦值運算符:三個規則! – Nawaz 2011-05-26 17:45:49

+0

@Alex:你是對的。我會更新... – 2011-05-26 17:52:22

1

正確的方法是重新定義arr_std::vector<std::string>和使用vector::reserve()來提示您期望擁有的字符串數量。讓C++爲你處理內存。

但是,如果你必須使用原始的C字符串,你可能想:

arr_ = new char *[sz_]; 
2

1.建立一個適當的字符串類

2.建立一個適當的數組類

3.使用字符串上的數組

快樂追逐內存泄漏,雙重釋放和內存損壞。

+0

是的,除非你沒有回答他的問題。 「我沒有被允許使用STL,MFC等。」顯然,他正在遵循一些具體的指導原則,所以如果不是有點卡住,你的回答是完全沒有幫助的。 – leetNightshade 2011-05-26 18:04:33

+1

@leetNightshade:它絕對卡住了,意味着嘲諷。但是,不使用STL或MFC並不意味着您無法創建自己的內存管理類。我的回答只是建議分解問題(String + Array),而不是試圖一次性解決問題。而且我知道這些課程並不完美,專家認爲他們錯了。 – 2011-05-27 06:14:31

+0

M .: +1說得好。 :) – leetNightshade 2011-05-28 06:35:10