数组和指针在做函数参数时有何区别?
最近看到这样一个程序:
#include <stdio.h>
void mystrcat(char *dest, char* source)
{
char *cp;
cp=dest;
while( *cp )cp++;
while(*cp++ = *source++);
}
int main()
{
char *str1= "abcde ";
char *str2= "fgh ";
mystrcat(str1,str2);
printf( "%s ",str1);
return 0;
}
程序运行后总是在mystrcat函数的while(*cp++ = *source++);一句中停下不继续执行并报错,而把主函数中的char *str1= "abcde ";改为char str1[]= "abcde ";然后再运行就OK了,请问数组和指针在做函数参数时有什么区别啊?
[解决办法]
char *str1= "abcde "
=======
str1指向常量字符串,当然不能做目的地址
[解决办法]
,
char *str1= "abcde ";
相当于
const char *str1= "abcde ";
while( *cp )cp++;是可以的
但不能(*cp++ = *source++);//他指向的内存被const修饰
解决方法改成Release编译
指针和数组的区别则要另行举例
[解决办法]
str1能否认为就是常量指针呢?即等于const char* str1= "abcde ";是这样的吗?
--------------------------
是
[解决办法]
这是为了兼容老的语言故意留下的一个bug
"abcde "被称为literal,实际上等价于const char *
因此char * p = "abcde "把一个char * 指针指向了const char*,p指向的内容实际是不可修改的,但是从函数内部看,char*自然是可以修改的
楼上说p++的问题,实际和此无关,这里const是修饰p指向的内容,而不是p本身
如果你需要p++不行,需要这样写: char * const p
[解决办法]
如果char *str1= "abcde " 那LZ就试图修改常量字符串,报错
如果char str1[]= "abcde " 那LZ往数组str[6]里面连接字符串,将超过数组长度,可以运行,不过破坏了栈空间数据,比较危险,最好这两各字符串都在堆区分配合适的长度比较好
[解决办法]
主要原因是 str1是指向常量字符串(位于静态存储区的),它的值是不能被修改的,而数组是分配在栈内存里面的,其值可以修改,所以你改成改为char str1[]= "abcde ";就对了。
等到接分啊。。
[解决办法]
数组名作为参数传递给函数时,会自动退化为指针。
[解决办法]
char *str1= "abcde ";
char *str2= "fgh ";
str1,str2,指向的是字符串常量的地址,
while(*cp++ = *source++);
修改的是常量的内容,当然不行了,你应该知道常量是不能修改的