结构数组初始化和字符串文字

时间:2010-05-05 07:34:20

标签: c++

以下数组初始化是否正确?我想是的,但我不确定我是否可以使用const char*或者我是否应该使用std::string。除了第一个问题,char指针是否指向相同大小的内存段?

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

6 个答案:

答案 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)

它看起来对我不错。看不出任何错误。