数组和指针在做函数参数时有何区别?

juicejerry 2007-09-26 01:44:52
最近看到这样一个程序:
#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了,请问数组和指针在做函数参数时有什么区别啊?
...全文
553 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sai3000 2008-09-24
  • 打赏
  • 举报
回复
学习了~~~
moon_in_sky 2007-09-27
  • 打赏
  • 举报
回复
char *str1="abcde";
char *str2="fgh";

str1,str2,指向的是字符串常量的地址,
while(*cp++ = *source++);
修改的是常量的内容,当然不行了,你应该知道常量是不能修改的
Nimux 2007-09-27
  • 打赏
  • 举报
回复
数组名作为参数传递给函数时,会自动退化为指针。
uestccl 2007-09-27
  • 打赏
  • 举报
回复
主要原因是 str1是指向常量字符串(位于静态存储区的),它的值是不能被修改的,而数组是分配在栈内存里面的,其值可以修改,所以你改成改为char str1[]="abcde";就对了。

等到接分啊。。
juicejerry 2007-09-27
  • 打赏
  • 举报
回复
awperpvip(挖靠我狂晕来CSDN这么久,竟不知道原来名字可以这么长) (
说的没错,我改为release下试了,可以,后来在tc2.0下试也可以;
=================
根据uestccl()的提示,我刚才从google找到csdn中一篇题为
《指针到底能不能修改其指向的常量字符串?看<高质量C C++编程指南>的疑惑 》的问题及讨论,其实和我问的问题差不多,其中最有权威的我将其摘录下来:


修改常量字符串的行为是未定义的。

C99
6.4.5 String literals
6. It is unspecified whether these arrays(指常量字符串)are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

C++标准(first edition)
2.13.4
2. whether all string literals are distinct is implementation-defined. The effect of attemping to modify a string literal is undefined.

所以,修改常量字符串的行为是为定义的,不同的编译器可以由不同的行为


通过问这个问题,自己总结以下几点:

1.常量字符串被编译器分配在内存的静态存储区,其生命期在整个程序中都是有效的;
2.指向常量字符串的指针当然是常量指针,常量指针就是指针本身可以修改,但指针指向的内容不能被修改;
3.修改常量字符串的行为是未定义的,不同的编译器可以有不同的行为;
2.不同编译器的实现不同,本质上是实模式和保护模式下内存访问机制的不同造成。
最后再次感谢大家的帮助!
luowei98 2007-09-27
  • 打赏
  • 举报
回复
正好碰到这个问题,看懂咯!
tdcr5 2007-09-26
  • 打赏
  • 举报
回复
如果char *str1="abcde" 那LZ就试图修改常量字符串,报错
如果char str1[]="abcde" 那LZ往数组str[6]里面连接字符串,将超过数组长度,可以运行,不过破坏了栈空间数据,比较危险,最好这两各字符串都在堆区分配合适的长度比较好
arong1234 2007-09-26
  • 打赏
  • 举报
回复
这是为了兼容老的语言故意留下的一个bug
"abcde"被称为literal,实际上等价于const char *
因此char * p = "abcde"把一个char * 指针指向了const char*,p指向的内容实际是不可修改的,但是从函数内部看,char*自然是可以修改的

楼上说p++的问题,实际和此无关,这里const是修饰p指向的内容,而不是p本身

如果你需要p++不行,需要这样写: char * const p
ming4098 2007-09-26
  • 打赏
  • 举报
回复
str1能否认为就是常量指针呢?即等于const char* str1="abcde";是这样的吗?
--------------------------
awperpvip 2007-09-26
  • 打赏
  • 举报
回复

char *str1="abcde";
相当于
const char *str1="abcde";
while( *cp )cp++;是可以的
但不能(*cp++ = *source++);//他指向的内存被const修饰
解决方法改成Release编译
指针和数组的区别则要另行举例

juicejerry 2007-09-26
  • 打赏
  • 举报
回复
str1能否认为就是常量指针呢?即等于const char* str1="abcde";是这样的吗?
juicejerry 2007-09-26
  • 打赏
  • 举报
回复
但str1传到函数后怎么还能执行++运算呢,即while( *cp )cp++;
believefym 2007-09-26
  • 打赏
  • 举报
回复
char *str1="abcde"
=======
str1指向常量字符串,当然不能做目的地址

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧