写c++程序时,有这么个struct:
typedef struct FileInfo_S {
std::string name;
FILE_TYPE type;
int address;
unsigned int row;
unsigned int col;
}FileInfo_s;
想创建一个关于它的数组,用来保存一组数据. 于是习惯性的用了c语言的方法, 于是乎埋下了祸根!:
#define MAX_FILE_NUM 10
FileInfo_s * files_info = (FileInfo_s *)malloc(MAX_FILE_NUM * sizeof(FileInfo_s));
后面的代码中,这样操作它:
for(...) {
...
files_info[file_num_count].name = filename;
files_info[file_num_count].address = ddr_addr;
files_info[file_num_count].type = DATA_HEX_TXT;
files_info[file_num_count].row = 0;
files_info[file_num_count].col = 0;
}
程序报了奇怪的段错误,而且是在第二次循环。gdb报错在files_info[file_num_count].name = filename;这条语句上。
调试无果,突然想起malloc的内容是随机的,可能错误初始化了string类
于是乎,把初始化代码改成这样:
#define MAX_FILE_NUM 10
FileInfo_s * files_info = (FileInfo_s *)malloc(MAX_FILE_NUM * sizeof(FileInfo_s));
memset(files_info, 0, MAX_FILE_NUM * sizeof(FileInfo_s));
可以正常运行了!
这时候还不放心,想多测下。发现如果 files_info[file_num_count].name = filename(string类); 替换成 files_info[file_num_count].name = string("1");
又出段错误了!
最终,还是老老实实把初始化写作这样:
#define MAX_FILE_NUM 10
FileInfo_s * files_info = new FileInfo_s[MAX_FILE_NUM];
测试了几次,木有问题了。
最终也不知道string初始化时候都干了点啥。以后还是老老实实用new好了。