关于strcat,看上去错误却得到了正确结果,谁帮忙解释一下

C、C++和Java语言
回复
头像
allisfree
帖子: 228
注册时间: 2005-12-25 20:16
送出感谢: 0
接收感谢: 0

关于strcat,看上去错误却得到了正确结果,谁帮忙解释一下

#1

帖子 allisfree » 2007-03-29 21:24

代码: 全选

#include <iostream>
#include <string>

using namespace std;

int main()
{
	char *str1="567";
	char str2[5]="1234";

	strcat(str2, str1);
	strcat(str2, "abcdefghijklmn");

	cout << str2;
}
以上代码只是测试,有点乱,但能编译通过(Sorry,在MinGW上试的),结果也对,只是str2定义的这么小没问题吗,是不是有所谓的溢出的问题? 如果str2定义为str1一样的指针型,则编译没问题,运行出错。
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
送出感谢: 0
接收感谢: 1 次
联系:

#2

帖子 laborer » 2007-03-29 22:16

g++试了下,不行。没错只能说明你rp不错。
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
头像
longxj
帖子: 215
注册时间: 2006-10-07 15:17
送出感谢: 0
接收感谢: 0

#3

帖子 longxj » 2007-03-30 20:01

不可能正确吧
头像
titainium
帖子: 689
注册时间: 2006-12-02 12:25
送出感谢: 0
接收感谢: 0

#4

帖子 titainium » 2007-03-30 22:32

这样还会正确?神奇
Titainium
huajg
帖子: 1
注册时间: 2007-04-30 13:09
送出感谢: 0
接收感谢: 0

#5

帖子 huajg » 2007-05-09 15:46

int main()
{
char *str1="567";
char str2[5]="1234";

strcat(str2, str1);
strcat(str2, "abcdefghijklmn");

printf("%s", str2); //修改过
}

编译是否通过就看你的编译器是否对越界进行检查了。我用gcc 4. 1 . .2是编译通过的。
运行是否正确就看strcat操作后,str2后溢出的内存空间是否占用了该程序没有使用过的内存,
如果溢出的内存影响程序的运行就会报错,否则程序就可以正常运行。

//
如果str2定义为str1一样的指针型,则编译没问题,运行出错。

char* str2="1234";
这里str2的空间是分配在静态数据区,空间在编译时就分配好,大小固定。
如果执行strcat肯定没有空间存放其他数据。
ghoulr
帖子: 28
注册时间: 2006-11-15 18:35
送出感谢: 0
接收感谢: 0

#6

帖子 ghoulr » 2007-05-11 22:02

编译应该可以通过,但是运行时应该有个segment fault之类的错误
回复

回到 “C/C++/Java”