65,187
社区成员




//1)
char dest1[4]="aaa";
char src1[6]="bbbbb";
strcpy(dest1,src1);
cout<<dest1<<endl;
// 输出bbbbb
// 这个已经出错了,编译器没有报错,这是逻辑错误,你在4个字节的内存里放了6个数据,C,C++
// 是允许的,不过别人不会放过你的,你用了别的内存了。
// 如果你的程序,还要用到,dest1后面2字节的内存中存放的数据,那么对不起,这个数据被
// strcpy(dest1,src1);修改了,不是原来的那个值了,会出现想破脑袋,都想不明白的错误!!!!!
//2)
char dest2[4]="aaa";
char* src2="bbbbb";
strcpy(dest2,src2);
cout<<dest2<<endl;
// 输出bbbbb,
// 这个和第一个一样,这两种写法的区别是,src2是个指针,占用四sizeof( char*)大小的内存,
//"bbbbb"这个常量另外存储,占用6个字节即字符串;
//即"bbbbb"的长度5加上结束符'\0'的长度一个字节的内存。
//指针src2的值是,存储"bbbbb"的内存的首地址,多占用一个指针长度的内存。
//src1是个数组,常量"bbbbb";就存储在src1中,数组首地址就是常量 "bbbbb",占用的内存;
//数组名src1,这个指针常量的值,是数组首地址。数组名src1不占用内存,这个数组占用6个字节的内存;
//这个数组用常量初始化,但数组不是常量,数组名是个指针常量。
//而这两个居然崩了
//3)
char* dest3="aaaaa";
char src3[4]="bbb";
strcpy(dest3,src3);// 数据拷到常量中,编译器暗地里使坏!
// 表面允许,编译可以通过,暗地里使绊子,运行时出错!
// 用字符常量初始化指针,常量数据放到常量区,不可写,写出错!
cout<<dest3<<endl;
//char* dest3,从使用上看,是指向常量字符串的指针,但是这是一个字符串指针,不是常量字符串指针,
//而且这个指针本身也不是常量,所以 strcpy(dest3,src3);编译可以通过,不过"aaaaa";是常量;
//编译器可以把它存储在常量区,这里用常量字符串,初始化非常量指针,
//有人说,这是为了和C兼容,而留下的口子,如果严格执行类型检查的话,编译应该不能通过才对!!!
//
//不过用常量指针初始化非常量指针,应该是比较正常的行为吧,因为可以用常量初始化非常量的。
//如果只能用变量给变量赋值,那是任何一门编程语言也做不到的。
//
//4)
char* dest4="aaaaa";
char* src4="bbb";
strcpy(dest4,src4);
cout<<dest4<<endl;
// 求指点!!!
//这和第三个一模一样,不过两个指针,都是用常量字符串,初始化罢了!!!