【问题标题】:Multidimensional Arrays initialized,What is differnce of Initialize with declarations and Initialize after declaration?多维数组初始化,声明后初始化和声明后初始化有什么区别?
【发布时间】:2019-07-27 12:52:42
【问题描述】:

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

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

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:使用未初始化的内存。

方法一和方法二有什么区别?

【问题讨论】:

  • 我的编译器是 Visual Studio 2019。
  • method2 中的 arr 是什么?
  • 方法1:使用声明初始化。 .方法2:声明后初始化
  • 您需要发布minimal reproducible example。这包括一个任何人都可以按原样编译的完整程序,以及重现问题所需的任何输入。
  • 我发布了一个新代码

标签: c++ visual-c++


【解决方案1】:

如果列表中的元素多于数字,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。但是,在这种情况下,数组是一个二维数组,并且是动态分配的(不要忘记之后释放它)。通常你应该check if new succeeded

注意:Static array vs. dynamic array in C++.


第二种方法将使用双 for 循环将二维数组的所有元素初始化为零。


第三种方法会将全局数组的元素初始化为零,因为Why are global and static variables initialized to their default values?

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2011-04-15
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多