2010-05-05 69 views
5

以下數組初始化是否正確?我想是的,但我不確定我是否可以使用const char*或者如果我最好使用std::string。除了第一個問題之外,char指針指向相同大小的內存段嗎?結構數組初始化和字符串文字

struct qinfo 
{ 
    const char* name; 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, 
    {"QTESTLONGNAME", 2}, 
    {"QTEST2", 3}, 
    {"QIEC", 4} 
}; 
+1

我只想留在'char const *'。除非你想受靜態初始化命令失敗的困擾,否則最好不要切換到'std :: string'。 – 2010-05-05 20:53:12

回答

2

是的,看起來不錯。很明顯,你將無法修改任何名稱字符串(儘管你可以根據需要將指針改爲指向不同的字符串)。每個常量字符串的存儲空間將盡可能多,並且通常是隻讀的。

2

看起來不錯,字符串的內存大小將會不同,因爲char *初始化的數組將被分配不同的大小。編譯器將分配足夠的空間來包含字符,然後再附加一個「\ 0」來終止字符串。

+0

@ markh44公平點,編輯迴應。 – shuttle87 2010-05-06 02:27:29

1

沒關係,因爲字符串文字具有靜態存儲持續時間。在這種情況下不需要使用std::string,因爲它將涉及運行時的動態內存分配。

2

初始化很好,但char *會指向不同大小的內存塊,因爲它們需要保存不同長度的字符串。對於你的其他問題,如果你想確保struct成員指向的字符串在初始化後保持不變,你應該使用const std :: string(我在這裏忽略了轉換黑客)。要使用字符指針來做同樣的事情,您需要聲明它爲

const char* const 

即,值指針和指向的值都是常量。

0

你的代碼很好,但是這些字符串會有不同數量的內存,可能是隻讀的。

要回答這個反問,一個小的調整時struct將允許字符串修改和修復(當然還是特定平臺)內存佈局很好:

struct qinfo 
{ 
    char name[50]; // string lives inside the struct 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, // the literals are used to initialize the char array 
    {"QTESTLONGNAME", 2}, // they should not be otherwise 
    {"QTEST2", 3},  // compiled into the program 
    {"QIEC", 4} 
}; 
0

它看起來不錯,我。無法看到任何錯誤。