c++ - 多维数组初始化,声明后初始化和声明后初始化有什么区别?
问题描述
多维数组初始化有什么区别?
这是“最长公共子序列”问题。
string str1, str2;
getline(cin, str1);
getline(cin, str2);
int alphaCount[26] = { 0, };
int str1Len = str1.length();
int str2Len = str2.length();
int** arr = new int* [str1Len+1];
for (int i = 0; i < str1Len+1; i++)
{
arr[i] = new int[str2Len+1];
//Method One
for (int j = 0; j < str2Len+1; j++)
{
arr[i][j] = 0;
}
}
for (int i = 0; i < str1Len; i++)
{
for (int j = 0; j < str2Len; j++)
{
int y = i + 1;
int x = j + 1;
if (str1[i] == str2[j])
arr[y][x] = arr[y - 1][x - 1] + 1;
else
{
if (arr[y][x - 1] > arr[y - 1][x])// using uninitialized memory ERROR
arr[y][x] = arr[y][x - 1];
else
arr[y][x] = arr[y - 1][x];
}
}
}
cout << arr[str1.length()][str2.length()] << "\n";
// Method Two
// Not Error
for (int i = 0; i < str1Len + 1; i++)
{
for (int j = 0; j < str2Len + 1; j++)
{
arr[i][j] = 0;
}
}
// Method Three
//global valiable, Not Error
int arr[1001][1001];
为什么方法一有错误信息警告 C6001: using uninitialized memory 。
方法一和方法二有什么区别?
解决方案
如果列表中的元素多于数字,则 C++ 用零填充列表。因此这个静态数组:
int alphaCount[26] = { 0, };
将其所有成员初始化为零(明确将第一个元素设置为零,并让其他元素自动初始化)。
这个:
int** arr = new int* [str1Len+1];
for (int i = 0; i < str1Len+1; i++)
{
arr[i] = new int[str2Len+1];
for (int j = 0; j < str2Len+1; j++)
{
arr[i][j] = 0;
}
}
还将数组的所有元素初始化为 0。但是,在这种情况下,数组是 2D 数组,并且是动态分配的(不要忘记之后释放它)。通常,您应该检查 new 是否成功。
注意:C++ 中的静态数组与动态数组。
第二种方法将使用双 for 循环将 2D 数组的所有元素初始化为零。
第三种方法将全局数组的元素初始化为零,因为为什么将全局变量和静态变量初始化为其默认值?
推荐阅读
- python - 升级 AWS RDS 实例的停机时间会影响我的 celery 消息队列吗?
- android - After changing the theme to MaterialComponent default EditTextPreference buttons now with white text
- c# - HasData 数据播种无法正常工作 EF Core
- javascript - 使用 chrome 80 和 chromedriver v80 时,您的连接不是私有的
- r - 在 R 中编码 utf 8 的 write.csv
- sql - 在另一台服务器上运行调用 SSIS 的 SQL 代理 JOB 并获得 Nt Authority\Anonymous 登录错误
- python - 有没有办法在 bigquery 中使用 kmeans、tensorflow 保存的模型?
- r - (R) Error when trying to load the SQLDF package
- android - 改变背景亮度
- javascript - 添加到 JSON 文件 id 字段中的每个对象