char *a=(char*)malloc(3);
a[0]='1';
a[1]='2';
a[2]='3';
a[3]='4'; //这里开始超字节赋值
a[4]='5';
a[5]='\0';
cout<<a<<endl; //结果输出"12345“,正确
a=(char*)realloc(a,5); //对a重新分配,变为5个字节,原先分配的保持不变
cout<<a<<endl; //结果输出"123屯",因为找不到结束符
free(a);
从注释可知,malloc分配内存后,尽管超字节(下标超值)赋值,不会出错,因为往后内存可以找到结束符'\0';而realloc之后因为找不到字符串结束符,所以输出123之后乱码.
2. 再看下面:
char *a=(char*)malloc(3);
a[0]='1';
a[1]='2';
a[2]='\0';
a[3]='4'; //超字节赋值
a[4]='5';
a[5]='\0';
cout<<a<<endl;
//结果输出:12
char *b=(char*)malloc(3);
b[0]='3';
b[1]='4';
memcpy(a+2,b,2);
cout<<a<<endl;
//结果输出:12345
3.
char *a=(char*)malloc(6);
a[0]='1';
a[1]='2';
a[2]='3';
a[3]='4'; //超字节赋值
a[4]='5';
a[5]='\0';
cout<<a<<endl;
char *b=(char*)malloc(3);
memcpy(b,a,3);
cout<<b<<endl; //输出没乱码,结束符'\0'自动添加?
free(a);
free(b);