0

我正在尝试替换'G''R'但我遇到了未处理的异常。

int main()
{
    char *pszStr1 = "EFGH";

    (++pszStr1)[1] = 'R';

    printf("%s", pszStr1);
    return 0;
}
4

6 回答 6

6

您的字符串位于只读区域。

相反,做

int main()
{
    static char pszStr1arr[] = "EFGH";
    char *pszStr1 = pszStr1arr;

    (++pszStr1)[1] = 'R';
    printf("%s", pszStr1);
    return 0;
}
于 2013-08-12T08:52:35.470 回答
3
int main()
{
    char *pszStr1 = "EFGH";

    (++pszStr1)[1] = 'R';

    printf("%s", pszStr1);
    return 0;
}

在此代码pszStr1中是一个字符串文字,必须将其视为const char *pszStr1 = "EFGH";. 您正在尝试修改只读内存空间。

于 2013-08-12T08:52:26.440 回答
1
char *pszStr1 = "EFGH";

是一个字符串文字,但在这里就像你写的:const char* pszStr1 = "EFGH";

您正在尝试修改只读内存空间...

您只需将其更改为即可解决它:

char pszStr1[] = "EFGH";
于 2013-08-12T08:54:14.087 回答
0

字符串文字在现代 C 中是 const,所以声明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;
}
于 2013-08-12T09:06:49.290 回答
0

字符 *pszStr1 = "EFGH";

保存在可执行文件的只读部分。编译器在内部分配字符串“EFGH”,然后使 pszStr1 指向它。所以,你不能改变它。使用数组而不是 char 指针,如下所示:

        char pszStr1[] = "EFGG";
于 2013-08-12T08:54:50.363 回答
0

char *pszStr1 = "EFGH";是一个常数,如果你改变内容,它是未定义的。

如果要更改内容,则必须取一个数组:

char arr[] = "EFGH";

你可以这样做:

arr[2] = 'R';
于 2013-08-12T08:55:20.587 回答