初学:strcpy的疑问,应该还是字符数组和字符指针的问题

vivanboy 2005-11-21 03:20:50
char strcp1[4];
char strcp2[] = "abcdefghijklmn";
char* strcp3;
strcp3 = strcpy(strcp1,strcp2);
printf("%d\n",sizeof(strcp1)); // print 4
strcp1[0] = 'L';
printf("%s,%s\n",strcp1,strcp3); // 这里却都打印abcdefghijklmn
if(strcp3==strcp1)
{
printf("strcp3 is just strcp1!"); //完全一样
}

经过strcpy后,strcp1的sizeof当然是4,但为什么打印其值确是abcdefghijklmn,也没有任何错误!为什么?
...全文
206 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbvanguard 2005-11-21
  • 打赏
  • 举报
回复
只存在两个问题:
1:内存越界!
strcpy(strcp1,strcp2);这里把strcp2(长度为14)的串copy给strcp1(长度为4),改为
strncpy(strcp1,strcp2,3);strcp1的最后一个位置用来存放'\0',所以这里为3。
2:字符串没有结束
字符串是以'\0'为结束符的所以strncpy结束后再加一句:strcp1[3]='\0';
另外我在vc下试了一下,不存在搂住说的:"为什么打印其值确是abcdefghijklmn",既然有strcp1[0] = 'L';strcp1为栈内存是可改写的,所以打印出来的串首字母应该为L
moany 2005-11-21
  • 打赏
  • 举报
回复
应该是

strcp3 = strcpy(strcp1,strcp2); //这种情况只是将strcp1的地址给了strcp3
strcp1[0] = 'L'; //更改strcp1,也等于更改了strcp3
moany 2005-11-21
  • 打赏
  • 举报
回复
奥,是错了,不好意思,看错了。
MikeChen2003 2005-11-21
  • 打赏
  • 举报
回复
strcpy改成strncpy吧,这下安全了。
vivanboy 2005-11-21
  • 打赏
  • 举报
回复
huwei001982(編程浪子)和mrelay(whxzl) 的回答让人信服,给分
vivanboy 2005-11-21
  • 打赏
  • 举报
回复
to moany(长枪大戟) :
你的解释好像完全错误。
第一:strcp2是字符数组,肯定不是指向常量(strcp2如果是字符指针,才是指向常量)。
第二:修改strcp1,strcp2不会修改,因为是copy
mrelay 2005-11-21
  • 打赏
  • 举报
回复
strcpy 他不管内存溢出的,会把所有的字符串都拷贝过去的。

printf在打印的时候,我想他是遇到结束符是才会结束,所以就都打印出来了。
huwei001982 2005-11-21
  • 打赏
  • 举报
回复
根本就没错啊

sizeof 只是计算它占用的内存, 你申请时就是4, 它当然显示为4

但 strlen 可不管你申请的是多长, 它只找到 NULL 才结束

PS: 你用 strcpy 的方法就会产生传说中的越界, strcpy 把不属于 strcp1的内存也改动了
moany 2005-11-21
  • 打赏
  • 举报
回复
想知道长度
printf("%d\n",sizeof(strcp1));=》
printf("%d\n",strlen(strcp1));
zez 2005-11-21
  • 打赏
  • 举报
回复
内存越界!
moany 2005-11-21
  • 打赏
  • 举报
回复
char strcp2[] = "abcdefghijklmn"; //strcp2指向一个常量
strcp3 = strcpy(strcp1,strcp2); //编译器做了优化,这种情况只是将strcp2的地址给了strcp1
strcp1[0] = 'L'; //根改strcp1,也等于更改了strcp2
vivanboy 2005-11-21
  • 打赏
  • 举报
回复
更正:
printf("%s,%s\n",strcp1,strcp3); // 这里却都打印Lbcdefghijklmn

69,371

社区成员

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

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