为什么 char[] 工作,但 char * 不

Why char[] work,but char * doesn't

code1:

 int main()
    {
        char tmp[20] = "1.04";
        printf("float str is %s\n",tmp);
        delcharPoint(tmp);
        printf("%s\n",tmp); 
    }
    void delcharPoint(char *pStr)
    {
        char *pTmp = pStr;
        int flag_0 = 0;
        printf("*pTmp = %s\n",pTmp);
        printf("*pTmp = %s\n",pTmp);
        if(*pStr == '0')
        {
            pStr++;
            flag_0 = 1;
        }
        while(*pStr != '[=10=]')
        {
            if(*pStr != '.')
            {
                *pTmp++ = *pStr;
                pStr++;
            }
            else
            {
                pStr++;
                if(flag_0 ==1 && *pStr == '0')
                {   
                    pStr++;
                }
            }
        }
        *pTmp = '[=10=]';
    }

此代码运行良好并打印:

float str is 1.04
*pTmp = 1.04
*pTmp = 1.04
104

代码2:

int main()
        {
            char *tmp = "1.04";
            printf("float str is %s\n",tmp);
            delcharPoint(tmp);
            printf("%s\n",tmp); 
        }
        void delcharPoint(char *pStr)
        {
            char *pTmp = pStr;
            int flag_0 = 0;
            printf("*pTmp = %s\n",pTmp);
            printf("*pTmp = %s\n",pTmp);
            if(*pStr == '0')
            {
                pStr++;
                flag_0 = 1;
            }
            while(*pStr != '[=12=]')
            {
                if(*pStr != '.')
                {
                    *pTmp++ = *pStr;
                    pStr++;
                }
                else
                {
                    pStr++;
                    if(flag_0 ==1 && *pStr == '0')
                    {   
                        pStr++;
                    }
                }
            }
            *pTmp = '[=12=]';
        }

此代码无效,它打印:

float str is 1.04
*pTmp = 1.04
*pTmp = 1.04
Segmentation fault

两个代码之间的区别只是我在代码1中使用char[]而在code2.I中使用char *已经搜索了the difference between char[] and char *。但我仍然不知道是什么原因造成的这些代码之间的区别。

这里:

char *tmp = "1.04";

"1.04" 是字符串文字,字符串文字是不可变的,这意味着它无法更改。尝试这样做会导致未定义的行为。

另一方面,

char tmp[20] = "1.04";

创建一个 char 数组,将 "1.04" 复制到其中。修改数组的内容是合法的。