代码之家  ›  专栏  ›  技术社区  ›  LeleDumbo

更改静态数组

  •  3
  • LeleDumbo  · 技术社区  · 15 年前

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

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

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

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

    4 回复  |  直到 15 年前
        1
  •  6
  •   bdonlan    15 年前

    您定义的数组是指向字符串的指针数组;每个字符串都是一个 字面意义的 (即,被解释为指针的带引号的字符串)-这意味着它是一个 常数 ,即使你没有申报。不能修改字符串文字。

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

    // 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 };
    
        2
  •  2
  •   matli    15 年前

    参见C-FAQ。 Question 1.32

        3
  •  0
  •   Jay    15 年前

    与其将数组保持为指针数组,不如将其设置为二维字符数组,这样可以分配空间。

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

        4
  •  0
  •   Patrick    15 年前

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

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