我有这段代码:
cout<<"Enter first name (maximum "<<MAX_LENGTH<<" letters):";
cin>>name;
cin.ignore();
name[MAX_LENGTH] = '\0';
fName = new char [strlen(name)];
strcpy(fName, name);
delete [] fName;
但是一旦它到达delete [] fName
行,我就会收到运行时错误。
我从先前的帖子中发现,这是因为我在执行strcpy(fName, name);
时将指针更改为已分配的内存。但我不知道该怎么做才能避免它。
答案 0 :(得分:1)
fName = new char [strlen(name)];
strcpy(fName, name);
delete [] fName;
您分配了一个长度为strlen(name)
的数组,但随后复制了strlen(name)+1
个字符。这是因为strlen()
返回一个排除空终止符的值。但是strcpy
复制了空终止符。
这意味着对strcpy
的调用超出了缓冲区的末尾,之后程序的行为未定义。
答案 1 :(得分:0)
如果name
被声明为char name[MAX_LENGTH]
,则最大索引可以是MAX_LENGTH-1
,因为数组的零基于索引。使用
name[MAX_LENGTH] = '\0';
访问超出限制的内存。使用
name[MAX_LENGTH-1]= '\0';
此外,name
应该有MAX_LENGTH-1
个字符。
cout<<"Enter first name (maximum "<<MAX_LENGTH-1<<" letters):";
fname
必须与要复制的name
一样大,如果要使用new
取消分配必须 delete
。
答案 2 :(得分:0)
fName = new char [strlen(name)];
strcpy(fName, name);
delete [] fName;
问题是strcpy需要strlen(name)+1个字符(额外的一个用于结束0)。阅读有关C字符串表示的内容。