如何解决C++混洗数据集后打印输出出现segmentation fault的问题
Segmentation Fault 问题修复方案
核心错误原因
段错误由打印阶段的二维数组索引逻辑错误直接导致:
- 你定义的
array_X_set是二级指针结构,总长度为5430,每个元素指向一个长度为20的int数组,赋值阶段使用的array_X_set[i][j](表示第i个样本的第j个特征)逻辑完全正确。 - 打印阶段使用的
array_X_set[i + j * 5430]存在严重越界:当j≥1时,i + j * 5430的取值最小为5430,已经超过了array_X_set的合法下标范围(0~5429),访问非法内存直接触发段错误。
修复方法
直接修改打印循环内的array_X_set索引逻辑即可,修改后的代码段如下:
printf("printout the whole dataset after random mixing:\n"); for (int i = 0; i < 5430; i++) { printf(" %d ", i); for (int j = 0; j < 20; j++) // 替换为和赋值逻辑一致的二级指针访问方式 printf(" %d ", array_X_set[i][j]); printf(" %d ", array_Y_set[i]); printf("\n"); }
可选优化点
- 你当前使用的
rand()没有初始化随机种子,每次运行程序打乱数据集的顺序都完全一致,建议在调用mix_dataset前添加srand(time(nullptr));(需引入<ctime>头文件),实现每次运行的打乱结果不同。 - 程序结束前记得释放动态申请的内存,避免内存泄漏:先循环释放
array_X_set的每一行指针,再释放array_X_set本身,最后释放array_Y_set。
内容的提问来源于stack exchange,提问作者user16767585
相关产品推荐
相关产品推荐

