我试图用'R'
替换'G'
但我得到未处理的异常。替换字符串中的字符
int main()
{
char *pszStr1 = "EFGH";
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
我试图用'R'
替换'G'
但我得到未处理的异常。替换字符串中的字符
int main()
{
char *pszStr1 = "EFGH";
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
您的字符串位于只读区域。
相反,做
int main()
{
static char pszStr1arr[] = "EFGH";
char *pszStr1 = pszStr1arr;
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
int main()
{
char *pszStr1 = "EFGH";
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
在此代码pszStr1
是一个字符串,它必须被视为const char *pszStr1 = "EFGH";
。您正试图修改只读内存空间。
char *pszStr1 = "EFGH";
是一个字符串,但在这里它是像你这样写道:const char* pszStr1 = "EFGH";
您试图修改只读存储器空间...
char pszStr1[] = "EFGH";
:
你可以通过改变它变成简单的解决这个问题
char * pszStr1 =“EFGH”;
保存在可执行文件的只读部分。编译器内部分配字符串“EFGH”,然后使pszStr1指向它。所以,你不能改变它。使用数组,而不是字符指针,象下面这样:
char pszStr1[] = "EFGG";
char *pszStr1 = "EFGH";
是一个常数,它是不确定的,如果你改变的内容。
如果你想改变的内容,你必须采取一个数组:
char arr[] = "EFGH";
,你能够做到这一点:
arr[2] = 'R';
字符串位于现代的C常量,所以声明char *pszStr1 = "EFGH";
是错误的,应该是const char *pszStr1 = "EFGH";
。在许多操作系统中,它们最终会被标记为只读的内存中的一部分,操作系统强制您无法写入它们。如果将字符串文字复制到堆栈(或堆)上的临时字符串,则该程序起作用。
int main()
{
char str[5];
char *pszStr1=str;
strcpy(pszStr1,"EFGH");
(++pszStr1)[1] = 'R';
printf("%s", pszStr1);
return 0;
}
是否有你在这里使用'static'的原因? –
你的上面的代码工作正常。我的想法是只读,但如果用(pszStr1)替换(++ pszStr1)[1],它只会用'R'替换整个字符串。在这种情况下,只读 – debugger
@debugger的想法没有关键的是,如果你声明为'char * pszStr1 =“EFGH”;'然后'pszStr1'是指向常量字符串的指针而假设如果你声明它为'char pszStr1 [] =“EFGH”;'然后'pszStr1'是一个可以修改的数组。注意在Glglgl的代码中'pszStr1'指向一个数组注意到声明'char * pszStr1 = pszStr1arr;' –