为什么 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"
复制到其中。修改数组的内容是合法的。
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"
复制到其中。修改数组的内容是合法的。