以下数组初始化是否正确?我想是的,但我不确定我是否可以使用const char*
或者我是否应该使用std::string
。除了第一个问题,char指针是否指向相同大小的内存段?
struct qinfo
{
const char* name;
int nr;
};
qinfo queues[] = {
{"QALARM", 1},
{"QTESTLONGNAME", 2},
{"QTEST2", 3},
{"QIEC", 4}
};
答案 0 :(得分:2)
看起来很好,字符串的内存大小会有所不同,因为初始化的char *数组会被分配不同的大小。编译器将分配足够的空格来包含字符,然后再添加“\ 0”来终止字符串。
答案 1 :(得分:2)
是的,看起来不错。显然,您将无法随后修改任何名称字符串(尽管您可以根据需要将指针更改为指向不同的字符串)。每个const字符串的存储量将仅为所需的量,并且通常为只读字符串。
答案 2 :(得分:2)
初始化很好但是char *将指向不同大小的内存块,因为它们需要保存不同长度的字符串。对于你的另一个问题,如果你想确保struct member指向的字符串在初始化后保持不变,你应该使用const std :: string(我在这里忽略了cast hacks)。要使用char指针执行相同的操作,您需要将其声明为
const char* const
即。值指针和指向的值都是const。
答案 3 :(得分:1)
没关系,因为字符串文字有静态存储持续时间。在这种情况下无需使用std::string
,因为它将涉及运行时的动态内存分配。
答案 4 :(得分: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}
};
答案 5 :(得分:0)