【问题标题】:Difference between const char[] Variable; and "some chars"const char[] 变量之间的区别;和“一些字符”
【发布时间】:2017-01-24 09:44:42
【问题描述】:

我有这样的代码:

const char menu23[] = "2.3. ";
const char menu24[] = "2.4. ";   
const char menu25[] = "2.5. ";  
const char menu26[] = "2.6. "; 
const char menu27[] = "2.7. ";      
const char menu28[] = "2.8. ";  

MenuEntry menu[] = // MenuEntry is a struct
{
    {menu23,  MENU2_OPTIONS, 22, 24, 23,  0,  0,  0}, // 23
    {menu24,  MENU2_OPTIONS, 23, 25,  2,  0,  0,  0}, // 24
    {menu25,  MENU2_OPTIONS, 24, 26,  0,  0,  0,  0}, // 25
    {menu26,  MENU2_OPTIONS, 25, 27,  0,  0,  0,  0}, // 26
    {menu27,  MENU2_OPTIONS, 26, 28,  0,  0,  0,  0}, // 27
    {menu28,  MENU2_OPTIONS, 27, 29,  0,  0,  0,  0} // 28
}

我可以用这个代替吗?

MenuEntry menu[] = // MenuEntry is a struct
{
    {"2.3. ",  MENU2_OPTIONS, 22, 24, 23,  0,  0,  0}, // 23
    {"2.4. ",  MENU2_OPTIONS, 23, 25,  2,  0,  0,  0}, // 24
    {"2.5. ",  MENU2_OPTIONS, 24, 26,  0,  0,  0,  0}, // 25
    {"2.6. ",  MENU2_OPTIONS, 25, 27,  0,  0,  0,  0}, // 26
    {"2.7. ",  MENU2_OPTIONS, 26, 28,  0,  0,  0,  0}, // 27
    {"2.8. ",  MENU2_OPTIONS, 27, 29,  0,  0,  0,  0} // 28
}

有什么功能上的区别吗?

【问题讨论】:

  • 这将有助于显示MenuEntry的定义

标签: c xc8


【解决方案1】:

有一个很大的区别。

在这个问题中,MenuItem 的第一个成员必须是char * 类型。 (否则此问题中的第一个版本的代码将因编译错误而失败。)

char menu23[] = "2.3. "; 这是一个字符数组。字符串存储在数组的内存中。它的生命周期与数组相同。如果它是在函数中定义的,它将在函数返回后被销毁。如果它被定义为全局变量,那么与第二个版本没有功能差异。 (但在实现方面仍然不同。)

{"2.3. ", MENU2_OPTIONS, 22, 24, 23, 0, 0, 0}, 此行中的字符串是文字常量。它将存储在内存的静态区域中。它的生命周期将与您的应用程序相同。

【讨论】:

    【解决方案2】:

    没有区别。不过,如果您想稍后更改每个菜单的名称(以及在多个位置使用常量名称的情况),第一个可能会更加灵活。

    【讨论】:

    • 大体上是有区别的;如果有问题的结构有第一个成员的数组,那么第二个版本可以工作,但第一个版本不行。 (由于第一个版本适用于 OP,我们可以推断该结构有一个 const char * 成员)
    • @MM 错了。如果MenuEntry 的第一个成员是char 数组,则第二个版本也不起作用。因为不能用字符串文字分配 char 数组。我们必须使用strcpy() 之类的东西来做到这一点。否则会出现编译错误。
    • @MartinZhai 字符串字面量可以初始化一个 char 数组,例如 char x[4] = "abc"; 。你把初始化和赋值混淆了
    • @M.M 你的代码可以工作。但是这个问题的场景是分配而不是初始化。结构的成员只能在其构造函数中初始化。
    • @MartinZhai C 中没有构造函数。MenuEntry menu[] = { 表示初始化。它声明menu,然后提供初始化器。赋值语句不声明任何内容。
    猜你喜欢
    • 2018-11-05
    • 2013-04-23
    • 2011-02-25
    • 1970-01-01
    • 2011-03-07
    • 2021-12-28
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多