strcpy函数问题
这个函数是用于复制字符串的,但是我不理解的是为什么一般程序再用这个函数strcpy(x,y)x的数组长度都要在y长度上+1,这个加1什么用,这个多的空间不是白白浪费了?...
这个函数是用于复制字符串的,但是我不理解的是为什么一般程序再用这个函数strcpy(x,y)x的数组长度都要在y长度上+1,这个加1什么用,这个多的空间不是白白浪费了?
展开
7个回答
展开全部
标准C中的字符串都会以'\0'作为结束符,strcpy函数会将字符串y的内容考呗到x中,同时,在x后面补上'\0'作为结束(同样,y的结束也是'\0')。
看下面这个例子
------我是分割线-------
char a[] = "1234";
char b[4];
printf("lenth of a: %d",strlen(a) );
strcpy(b,a);
strlen(a)的结果是4,因为strlen没有算最后的那个'\0'.
上面的例子在大多数情况下都不会出现程序的崩溃。但其实,执行strcpy(b,a)就已经出错了,因为strcpy越界写了内存,在不属于b的内存上(b[3]的下一个字节位置)写了一个'\0'。
有种黑客攻击手段叫做缓冲区溢出,就是利用的这个原理。
看下面这个例子
------我是分割线-------
char a[] = "1234";
char b[4];
printf("lenth of a: %d",strlen(a) );
strcpy(b,a);
strlen(a)的结果是4,因为strlen没有算最后的那个'\0'.
上面的例子在大多数情况下都不会出现程序的崩溃。但其实,执行strcpy(b,a)就已经出错了,因为strcpy越界写了内存,在不属于b的内存上(b[3]的下一个字节位置)写了一个'\0'。
有种黑客攻击手段叫做缓冲区溢出,就是利用的这个原理。
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
加的这个1并不是多余的,为了复制后可以将x以一个字符串输出,那么就得在最后一个位置上写上结束符\0,所以空间大小比元素个数多一个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char a[10]= "123456789";
char b[10]="123";
strcpy(a, b);
printf("%s\n", a);
你试一下这个就知道了,输出的结果就是123,这个函数会自动补上'\0'的,我们平时用这个函数的时候从来没看过带+1的。
只有在用memcpy的时候需要+1,比如memecpy(a, b, strlen(b)+1)。
char b[10]="123";
strcpy(a, b);
printf("%s\n", a);
你试一下这个就知道了,输出的结果就是123,这个函数会自动补上'\0'的,我们平时用这个函数的时候从来没看过带+1的。
只有在用memcpy的时候需要+1,比如memecpy(a, b, strlen(b)+1)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
字符串是以\0结束的 \0是不计入字符串的长度 所以 在存储时 字符串实际占用空间要比自身长度多出一个来存储 结束标志位\0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询