读书人

为什么在堆空间申请特定长度的字符数组

发布时间: 2012-06-08 12:55:24 作者: rapoo

为什么在堆空间申请特定长度的字符数组后还是有多余的字符?
代码如下:
int leng;
char *str;
string relay_s;
for (int i = 0; i <= 7; i++)
{
infile.read((char *)&leng,4);
str = new char (leng);
infile.read(str,leng);
relay_s = str;
p_new->data.transfer_series_func(relay_s,i);
}
infile.read((char *)&relay_f,4);
p_new->data.transfer_purchase_sum(relay_f);
infile.read((char *)&relay_i,4);
p_new->data.transfer_purchase_amount(relay_i);

那个str是char *类型的,
就例如我读进leng = 1,接着下一位的字符是A,
但是在调试的时候发现,str的值为"A瓠?瓠?瓠韩?"
这是为什么?
求大神。。。。。。
就剩下这个问题了。。。。。。



[解决办法]
因为你给str分配内存后没有清零处理 后面加句memset()
[解决办法]
没加‘/n’
[解决办法]
但是在调试的时候发现,str的值为"A瓠?瓠?瓠韩?"

str的值是你申请到的空间的地址,而不是什么"A瓠?瓠?瓠韩?"
因为str的类型是char*,你用的调试工具认为它可能指向一个字符串,于是就从这个地址开始读字节并显示,直到遇到字符串结束符'\0'为止
很不幸你没有设置'\0',于是就把这块属于你的空间后面那些不属于你的随机字符也一起读进来了

记住:内存是连续的,你申请了一块空间,只意味着编译器保证这块空间只会被你改变
它旁边的空间你一样可以访问,但后果自负

读书人网 >C++

热点推荐