看下面代码:
char g_array[] = "abcd";
const char * g_pString = "abcd";
int main( int argc, char *argv[ ], char *envp[ ] )
{
g_array[0] = 'f';
((char *)g_pString)[0] = 'f';
return 0;
}
运行一下,会在 ((char*)g_pString)[0] = 'f'; 处产生异常,因此对于常量字符串,编译器不仅会在编译时作语
法上 的检查 , 还会自动为const声明的字符串所在的 内存块设置”只读“保护。
再看以下代码:
char * g_pString = "abcd";
int main( int argc, char *argv[ ], char *envp[ ] )
{
g_pString[0] = 'f';
return 0;
}
你会发现在 g_pString[0] = 'f'; 处也会产生异常,因为这种方式字符串被声明为常量字符串,编译器一样会
设置”只读“保护。
补充
2008-5-29 编译器仅在debug版本会放置于只读数据段(.rdata),对于Release版本,放置于可写数据段(.data),因此Release版本下改写这些数据不会出现异常。(未验证过这句话 ant~comment)