之前只知道死记char *str分配一个全局数组,通过它创造的字符串常量保存在只读的数据段,而通过char str[]创建的字符串是局部变量,存储在栈区。
下面通过一个程序具体看一下。
该程序是为了实现讲字符串中的单词逆序,例如,如果输入“I am a boy",希望输出"boy a am I"。
#include <stdio.h>
int main(void)
{
char *str="I am a boy!";
void reverse(char *start, char *end);
void reverseString(char *str);
reverseString(str);
puts(str);
}
void reverse(char *start, char *end)
{
char temp;
if(start==NULL||end==NULL)
return;
while(start<end)
{
temp=*start;
*start = *end;
*end=temp;
start++;
end--;
}
}
void reverseString(char *str)
{
if(str==NULL)
return;
char *start,*end;
start=end=str;
while(*end!='\0')
{
end++;
}
end--;
reverse(start,end);
start=end=str;
while(*start!='\0')
{
if(*start==' ')
start=++end;
else
if (*end==' '||*end=='\0')
{
reverse(start,--end);
start=++end;
}
else
{
end++;
}
}
}
程序编译没有问题,运行报错,提示写入内存0x........时失败。
根据报错的地址,发现是
void reverse(char *start, char *end)
{
char temp;
if(start==NULL||end==NULL)
return;
while(start<end)
{
temp=*start;
*start = *end; //出错
*end=temp;
start++;
end--;
}
}
也就是给*start写入数据出错,原因就是由于主函数中用char *str 创建的字符串是一个常量。只要把他改为char str[]即可。