定义字符串指针的两种方式,内部有什么区别?执行效果为何大不相同?
方式一:
char p[]={"0123456789"};
char *a=p;
方式二:
char *a={"0123456789"};
在使用指针a的过程中,发生区别的地方在于调用如下子函数(自己写的字符串倒置函数);
现象:向子函数传递方式二定义的指针会导致调试错误(编译通过了的),“Unhandle exception in *.exe:0xc0000005:Access Violation”
void changeLP( char *str)
{
char a;
if(str!=NULL)
{
unsigned int len=strlen(str);
for(unsigned int i=0; i<(len/2); i++)
{
a=*(str+i);
*(str+i)=*(str+len-1-i);
*(str+len-1-i)=a;
}
}
}
传递进方式一的指针a,就顺利执行。
我是自学C,基础不是很好。求解惑。
方式二定义的指针在主函数中执行printf("%d\n",*(a+3))打印都没有错的。
[解决办法]
char *p = “hello”;
和:
char p[] = “hello”;
区别:
第一个把一个常量字符串存入只读数据段,并用p指针指向其首位。后续程序可以通过该指针读取字符串内容,但不能改写。
第二个把字符串复制到栈空间里,并将此位置命名为 char p[]。后续程序可以通过字符数组p读取、更改该字符串,但不能改写p自身。