只赋值了前10个字节,第17、18字节为什么会变动,异常;
memset后,未赋值时,执行输出全是0,正常;求高手解答
1)pChar是一个字符型的指针变量,其值为字符(或字串首字符)在内存中的地址,你在
char *pChar=new char[20];
和
pChar="123456.789";
两处赋给了其两个完全不同的地址,所以打印出来的第17、18字节已经不在new出来的20个字节中了。
v 预期第17、18字节位置 v 实际打印位置
+---------------------------------------------------------+
| 0x00|... |'1' '2' ... '9' ... |
+---------------------------------------------------------+
^ new char[20] 得到的地址 ^"123456.789"字串所在地址
2)字符串是不可通过 "char指针变量 = 字符串"的方式赋值的,应该使用strcpy、strncpy等库函数。
兄弟,你怕是有什么误会哟。
你指针变量之间赋值关new的有什么事?
你这个指向的地址都变化了呀。
你把赋值前后的指针地址打印出来看看是不是一样的勒。
用字符串给C风格字符串赋值的编译顺序是这样的,先把引号内的字符串存储在某个地址,长度按字符数加1,存在哪和多长都是编译器自动计算并指定的。然后把该地址赋给字符指针。程序中Pchar 字符串的实际长度只有11个字节长。11位以后的数据都是相邻内存的数据,已经超出数组实际范围。
程序中指针先指向new 分配的内存,在用字符串赋值时编译器根据内部规则改变了指针指向,指向字符串常量地址。所以才会出现这种情况。
a两次地址不同,两次赋值地址两次变动,把new指针声明去掉,使其变为数组。
看看数组是怎么储存的。
int *a = {3,1,2};
char b = '\0';
/*
0x1000 0x1004 0x1008
00000011 00000001 00000010
a指向0x1000
a[1]//a指向0x1004
a[0]//a指向0x1001
a[2]//a指向0x1008
a[10]//over,溢出,碰到了b。
*/
memset(a,0,sizeof(a));//此时此刻,新的地址将被a指向……