2013-08-12 121 views
0

我试图用'R'替换'G'但我得到未处理的异常。替换字符串中的字符

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

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

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

回答

6

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

相反,做

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

    (++pszStr1)[1] = 'R'; 
    printf("%s", pszStr1); 
    return 0; 
} 
+5

是否有你在这里使用'static'的原因? –

+0

你的上面的代码工作正常。我的想法是只读,但如果用(pszStr1)替换(++ pszStr1)[1],它只会用'R'替换整个字符串。在这种情况下,只读 – debugger

+0

@debugger的想法没有关键的是,如果你声明为'char * pszStr1 =“EFGH”;'然后'pszStr1'是指向常量字符串的指针而假设如果你声明它为'char pszStr1 [] =“EFGH”;'然后'pszStr1'是一个可以修改的数组。注意在Glglgl的代码中'pszStr1'指向一个数组注意到声明'char * pszStr1 = pszStr1arr;' –

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

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

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

在此代码pszStr1是一个字符串,它必须被视为const char *pszStr1 = "EFGH";。您正试图修改只读内存空间。

1
char *pszStr1 = "EFGH"; 

是一个字符串,但在这里它是像你这样写道:const char* pszStr1 = "EFGH";

您试图修改只读存储器空间...

char pszStr1[] = "EFGH"; 

你可以通过改变它变成简单的解决这个问题

0

char * pszStr1 =“EFGH”;

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

 char pszStr1[] = "EFGG"; 
0

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

如果你想改变的内容,你必须采取一个数组:

char arr[] = "EFGH"; 

,你能够做到这一点:

arr[2] = 'R'; 
0

字符串位于现代的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; 
}