#include <iostream>
using namespace std;定义类
class fancyString {
private:
char *content;
bool flag_bold;
bool flag_italics;
public:
fancyString(){
content="";
flag_bold= false;
flag_italics=false;
}在这两个函数中,我都被要求使用老式的calloc
fancyString(char* cntnt){
content=(char *) calloc(strlen(cntnt)+1, sizeof(char*));通常,strcpy是导致崩溃的主要原因。
strcpy(cntnt,content);
}
fancyString(fancyString & f1){
content=(char *) calloc(strlen(f1.content)+1, sizeof(char*));通常,strcpy是导致崩溃的主要原因。
strcpy(f1.content,content);
flag_bold=f1.flag_bold;
flag_italics=f1.flag_italics;
}
friend ostream& operator<<(ostream& os, const fancyString& FS){
os<<"string is "<<FS.content<<endl<<"bold status is "<<FS.flag_bold<<endl<<"italics status is "<<FS.flag_italics<<endl;
return os;
}
~fancyString(){
cout << "Destroying the string\n";
if ( content != NULL )
free (content);
}
};main函数
int main(int argc, const char * argv[]) {
fancyString fs1 ("First Example");
fancyString fs2(fs1);
cout<<fs2;
return 0;
}发布于 2020-01-15 05:06:15
你把strcpy调用的参数弄错了!请参阅cppreference上的定义
char * strcpy ( char *目标,常量char *源);
所以,在你的第一个构造函数中,调用:
strcpy(cntnt,content);正在尝试将新分配的缓冲区复制到传递的参数中,该参数实际上是一个(常量)字符串文字:
int main(int argc, const char * argv[]) {
fancyString fs1 ("First Example");
//...根据评论中的建议注意到了:
(1)请注意,在您的calloc调用中-它分配了一个char的“数组”,元素的大小是sizeof(char) 而不是 sizeof(char*) (这对于指针的“数组”是合适的)。使用:
content = (char *) calloc(strlen(cntnt)+1, sizeof(char));类似地在复制构造函数中也是如此。
(2)假设您的第一个构造函数从未打算修改作为其参数给定的字符串,那么您实际上应该将其指定为const
fancyString(const char* cntnt){
//...(这将标记出strcpy参数错误的错误!)
请随时要求进一步澄清和/或解释。
https://stackoverflow.com/questions/59741694
复制相似问题