为什么输出11

xddzccn 2006-12-02 12:00:47
char a[12]="hello world";

char *p;

char str_a[10];


p=str_a;


strcpy(p,a);


printf("the lengh is %d",strlen(p));


}
...全文
249 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CAIZHU 2006-12-02
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>

void main()
{

char a[12]="hello world";

char *p;

char str_a[10];


p=str_a;


strcpy(p,a);

printf("%s",str_a);
printf("\n");
printf("the lengh is %d\n",strlen(p));


}

运行结果
hello world
the lengh is 11

危险 数据溢出 
会覆盖其他的数据成员的 
最好加给判断 
如果strlen(p)>10 则返回错误 
程序漏洞 就是缺乏判断引起的
wenbaby 2006-12-02
  • 打赏
  • 举报
回复
char str_a[10];


p=str_a;


strcpy(p,a);
____
这样用是很危险的.就算下面这样,结果也应该是11,但是是危险的.
char str_a[2];


p=str_a;


strcpy(p,a);
xddzccn 2006-12-02
  • 打赏
  • 举报
回复
受教了,
危险 数据溢出 
会覆盖其他的数据成员的 
我要是想知道它覆盖了哪些数据成员,要怎么弄啊
FairLu 2006-12-02
  • 打赏
  • 举报
回复
strcpy并不会检查数组是否越界。返回值是字符串长度(以'\0'结束)。
strcpy(p,a);//a是一个12字节的数组,字符串长度为11,所以调用strcpy之后,p所指向的字符串的长度11。
jixingzhong 2006-12-02
  • 打赏
  • 举报
回复
strlen 从指定的位置开始查找,一直到出现 \0 字符的字节数目。

它不考虑参数数组的长度,
可能小于该长度, 也可能大于该长度。

呵呵,
如果越界使用数组,
在一些编译器下是会出错的 ....
灰太狼 2006-12-02
  • 打赏
  • 举报
回复
C語言中使用指針一定要注意,很容易出現指針問題,我個人認為隻要是指針一定要malloc,否則會出現異想不到的結果。
lockhall 2006-12-02
  • 打赏
  • 举报
回复
p指向的是"hello world",所以strlen(p) == 11.
lockhall 2006-12-02
  • 打赏
  • 举报
回复
就楼主本身的程序,如果越界的话也不是因为str_a[10]的缘故.
因为p = str_a;只是将数组str_a[]的首地址赋给了指针p
而指针p的内存并未申请.
所以最好在定义了指针p后,申请内存:p =(char*)mall(100*sizeof(char));
alan001 2006-12-02
  • 打赏
  • 举报
回复
也可以用strncpy
whatsouta 2006-12-02
  • 打赏
  • 举报
回复
虽然会产生越界,但仍然执行strcpy完整个a串,只要对str_a紧接着的内存有W权限。
执行strlen时计算到\0结束,因此为11。

69,371

社区成员

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

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