关于这个问题,源于一道题目:
char * get_str()
{
char str[]="abcdefg";
return str;
}
问这个函数中存在什么问题,编程方面我对于字符串用的很少,基础又比较薄弱,因此第一眼看上去感觉很对。但是经过对于字符数组和字符指针的学习,才发现自己陷入了一个误区。下面总结一下字符数组和字符指针的区别:
char* pstr="abcde";
char str[]="abcde";
这两者主要的区别在于初始化之后字符串的存储位置不同,char* 指针本身是局部变量,因此存储在内存中的栈上,但是指针所指向的字符串是常量,存储在只读数据段(和全局、静态存储区有区别),因此,所有试图去修改字符串的操作都会出现问题,比如:strcpy(pstr,“abclkj”);正确的使用strcpy的方法是:
char *ret;
ret=(char *)malloc((strlen(pstr)+1)*sizeof(char));
strcpy(ret,pstr);
则在程序中,可以使用如下语句:
pstr++; /* 指针pstr加1 */
pstr = "This is a NEW string."; /* 使指针指向新的字符串常量 */
pstr = str1; /* 改变指针pstr的指向 */
strcpy( str, "This is a NEW string.") /* 改变字符串的的内容 */
strcat( str, pstr) /* 进行串连接操作 */
在程序中,不能进行如下操作:
str++; /* 不能对数组名进行++运算 */
str = "This is a NEW string."; /* 错误的串操作 */
str = str1; /* 对数组名不能进行赋值 */
strcat(pstr, "This is a NEW string.") /* 不能在str的后面进行串连接 */
strcpy(pstr, str) /* 不能向str进行串复制 */
对于字符指针指向的字符串,因为是常量,因此,无论通过pstr[i]=‘H’或*pstr=‘H’都不可以改变字符串中的字符。
而字符数组,既可以通过下表访问也可以通过指针来修改字符串中的字符。
因此,文章开头的题目就可以改成:
char * get_str()
{
char *str="abcdefg";
return str;
}
或者将字符数组声明为static。