2010-05-05 61 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

它看起来不错,我。无法看到任何错误。