3

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

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

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

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

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

4

4 回答 4

6

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

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

// 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 };
于 2010-08-30T12:33:25.900 回答
2

请参阅 C-FAQ。问题 1.32

于 2010-08-30T12:33:53.970 回答
0

与其将数组保留为指针数组,不如将其设为二维字符数组,以便分配空间。

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

于 2010-08-30T12:33:46.320 回答
0

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

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

于 2010-08-30T12:33:52.327 回答