C++中InitializingMatrix与Output函数输出不一致的原因及修复
问题原因分析与修复方案
一、差异产生的原因
InitializingMatrix函数里的char matrix[9]是栈上的局部数组,函数执行完毕返回时,该函数的栈帧会被销毁,局部变量占用的内存会被释放(后续可能被其他代码覆盖)。此时返回的指针指向的是已经失效的内存区域,属于野指针。
当Output函数尝试通过这个野指针访问内存时,读到的是栈帧销毁后被覆盖的随机数据,自然和函数内初始化时的输出结果不一致。
另外原代码的随机字符生成逻辑存在错误:rand() % (int)end会导致生成的字符超出[start, end]的预期范围,需要修正为rand() % (end - start + 1)才能保证字符在目标区间内。
二、修复方案
方案1:使用动态内存分配(new)
在堆上分配数组,内存不会随函数返回而释放,使用完需手动释放避免内存泄漏:
#include <iostream> #include <ctime> using namespace std; char* InitializingMatrix(char start, char end) { char* matrix = new char[9]; // 堆上分配内存 srand((unsigned)time(0)); for (int i = 0; i < 9; i++) matrix[i] = start + rand() % (end - start + 1); // 修正随机范围 // 输出矩阵 for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } cout << endl; return matrix; } void Output(char matrix[]) { for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } } int main() { char* mat = InitializingMatrix('1', '6'); Output(mat); delete[] mat; // 释放堆内存 return 0; }
方案2:使用static局部数组
将数组声明为static,存储在静态存储区,函数返回后内存不会被释放:
#include <iostream> #include <ctime> using namespace std; char* InitializingMatrix(char start, char end) { static char matrix[9]; // 静态存储区数组 srand((unsigned)time(0)); for (int i = 0; i < 9; i++) matrix[i] = start + rand() % (end - start + 1); // 输出矩阵 for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } cout << endl; return matrix; } void Output(char matrix[]) { for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } } int main() { Output(InitializingMatrix('1', '6')); return 0; }
注意:static数组全局唯一,多次调用
InitializingMatrix会覆盖之前的数据,适合单场景使用。
方案3:使用std::array(C++11及以上)
用标准库的std::array替代原生数组,自动管理内存,避免指针问题:
#include <iostream> #include <ctime> #include <array> using namespace std; array<char, 9> InitializingMatrix(char start, char end) { array<char, 9> matrix; srand((unsigned)time(0)); for (int i = 0; i < 9; i++) matrix[i] = start + rand() % (end - start + 1); // 输出矩阵 for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } cout << endl; return matrix; } void Output(const array<char, 9>& matrix) { for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } } int main() { auto mat = InitializingMatrix('1', '6'); Output(mat); return 0; }
方案4:将数组作为参数传入
在main中创建数组,传递给InitializingMatrix函数初始化,完全避免指针返回:
#include <iostream> #include <ctime> using namespace std; void InitializingMatrix(char matrix[], char start, char end) { srand((unsigned)time(0)); for (int i = 0; i < 9; i++) matrix[i] = start + rand() % (end - start + 1); // 输出矩阵 for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } cout << endl; } void Output(char matrix[]) { for (int i = 0; i < 9; i++) { if (i == 3 || i == 6) cout << endl; cout << matrix[i] << " "; } } int main() { char mat[9]; InitializingMatrix(mat, '1', '6'); Output(mat); return 0; }
内容的提问来源于stack exchange,提问作者fzyier
相关产品推荐
相关产品推荐

