赋值前10个字节,第17、18字节会变动

图片说明

只赋值了前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指向……

望采纳。