我在文件中声明了一个静态变量:
static char *msgToUser[] = {
"MSG1 ",
"MSG2 ",
};
在我正在做的一个类的方法之一:
void InfoUser::ModifyMsg( BYTE msgIdx, char *msgString ){
strncpy( msgToUser[ idx ], msgString, DISPLAY_SIZE );
}
当我执行strncopy时,程序崩溃了。我不确定我做错了什么
答案 0 :(得分:6)
您定义的数组是一个指向字符串的指针数组;每个字符串都是 literal (即,被引用的字符串被解释为指针) - 这意味着它是常量,即使您没有这样声明它。您无法修改字符串文字。
如果您希望能够修改它们,可以使用显式数组分配:
// 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 };
答案 1 :(得分:2)
参见C-FAQ。 Question 1.32
答案 2 :(得分:0)
不要将数组保持为指针数组,而是将其设置为二维字符数组,以便分配空间。
现在,由于它是一个char *数组,并且使用字符串文字进行初始化,当您尝试覆盖字符串文字的只读内存时,它会崩溃。
答案 3 :(得分:0)
您已将msgToUser定义为char-pointers的向量。这些char指针指向存储在内存中的字符串(字符数组),该字符串已标记为只读(在Microsoft的Visual Studio中,您可以通过编译器选项更改此内容)。
因此,如果更改此内存,处理器将引发异常(您尝试写入只读内存),您的应用程序将崩溃。