首页 > 解决方案 > 多维数组初始化,声明后初始化和声明后初始化有什么区别?

问题描述

多维数组初始化有什么区别?

这是“最长公共子序列”问题。

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++visual-c++

解决方案


如果列表中的元素多于数字,则 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 数组的所有元素初始化为零。


第三种方法将全局数组的元素初始化为零,因为为什么将全局变量和静态变量初始化为其默认值?


推荐阅读