结构数组初始化和字符串文字
以下数组初始化是否正确?我想是的,但我不确定我是否可以使用const char*
或者如果我最好使用std::string
。除了第一个问题之外,char指针指向相同大小的内存段吗?结构数组初始化和字符串文字
struct qinfo
{
const char* name;
int nr;
};
qinfo queues[] = {
{"QALARM", 1},
{"QTESTLONGNAME", 2},
{"QTEST2", 3},
{"QIEC", 4}
};
是的,看起来不错。很明显,你将无法修改任何名称字符串(尽管你可以根据需要将指针改为指向不同的字符串)。每个常量字符串的存储空间将尽可能多,并且通常是只读的。
看起来不错,字符串的内存大小将会不同,因为char *初始化的数组将被分配不同的大小。编译器将分配足够的空间来包含字符,然后再附加一个“\ 0”来终止字符串。
@ markh44公平点,编辑回应。 – shuttle87 2010-05-06 02:27:29
没关系,因为字符串文字具有静态存储持续时间。在这种情况下不需要使用std::string
,因为它将涉及运行时的动态内存分配。
初始化很好,但char *会指向不同大小的内存块,因为它们需要保存不同长度的字符串。对于你的其他问题,如果你想确保struct成员指向的字符串在初始化后保持不变,你应该使用const std :: string(我在这里忽略了转换黑客)。要使用字符指针来做同样的事情,您需要声明它为
const char* const
即,值指针和指向的值都是常量。
你的代码很好,但是这些字符串会有不同数量的内存,可能是只读的。
要回答这个反问,一个小的调整时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}
};
它看起来不错,我。无法看到任何错误。
我只想留在'char const *'。除非你想受静态初始化命令失败的困扰,否则最好不要切换到'std :: string'。 – 2010-05-05 20:53:12