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