【问题标题】:Changing static array改变静态数组
【发布时间】:2011-04-05 17:51:32
【问题描述】:

我在文件中声明了一个静态变量:

static char *msgToUser[] = {
    "MSG1                ", 
    "MSG2                ",
};

在一个类的方法中,我正在这样做:

void InfoUser::ModifyMsg( BYTE msgIdx, char *msgString ){
    strncpy( msgToUser[ idx ], msgString, DISPLAY_SIZE );
}

当我执行 strncopy 时,程序崩溃了。我不确定我做错了什么

【问题讨论】:

    标签: c linux arrays segmentation-fault strncpy


    【解决方案1】:

    你定义的数组是一个字符串指针数组;每个字符串都是一个literal(即,一个被引用的字符串被解释为一个指针)——这意味着它是一个constant,即使你没有这样声明它。您不能修改字符串文字。

    如果您希望能够修改它们,可以使用显式数组分配:

    // Note: The space padding isn't needed if all you require is that the string
    // be able to hold DISPLAY_SIZE characters (incl the null terminator)
    static char str_1[DISPLAY_SIZE] = "MSG1                ";
    static char str_2[DISPLAY_SIZE] = "MSG1                ";
    static char *msgToUser[] = { str_1, str_2 };
    

    【讨论】:

    • 在这种情况下,甚至需要用虚拟值初始化它们吗? static char str_1[SIZE] 还不够吗?
    • 确实如此,在这种情况下,字符串将被初始化为空字符串(全为零)。我不确定 OP 是否想要 MSG1/MSG2,所以我留下了它们,但如果最初为空字符串也可以。
    • +1,但我会选择static char msgToUser[][DISPLAY_SIZE] = { "...", "..." };
    • @schot,那里的语义略有不同 - 特别是,您不能将其用作char **。不过打字更方便。
    【解决方案2】:

    请参阅 C-FAQ。 Question 1.32

    【讨论】:

      【解决方案3】:

      不要将您的数组保留为指针数组,而是将其设为二维字符数组,以便分配空间。

      现在,由于它是一个 char * 数组,并且使用字符串文字进行初始化,当您尝试覆盖字符串文字的只读内存时,它会崩溃。

      【讨论】:

        【解决方案4】:

        您已将 msgToUser 定义为字符指针向量。这些字符指针指向存储在内存中的已标记为只读的字符串(字符数组)(在 Microsoft 的 Visual Studio 中,您可以通过编译器选项进行更改)。

        因此,如果您更改此内存,处理器将引发异常(您正在尝试写入只读内存)并且您的应用程序将崩溃。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-15
          • 2020-07-13
          • 2012-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          相关资源
          最近更新 更多