写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好了。
