【问题标题】:Why some other value than zero is coming in first row?为什么第一行会出现除零以外的其他值?
【发布时间】:2020-02-05 12:00:00
【问题描述】:

我正在尝试使用C++ 中的数组创建一个MxN 零矩阵。但有些值不会归零。请帮我解决这个问题。

#include <iostream>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
int i,j,s[m][n]={0};
for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        cout<<s[i][j]<<" ";
    }
    cout<<endl;
}
}

输入: 4 4

输出:

0 11097 1757549776 11097 
0 0 0 0 
0 0 0 0 
0 0 0 0 

预期输出:

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

【问题讨论】:

  • s[m][n] = {0} 甚至不是有效的 C++。尝试改用std::vector&gt;std::vector&lt;int&gt; &gt;。例如,std::vector&lt;std::vector&lt;int&gt; &gt; s(m, std::vector&lt;int&gt;(n)) 将为您提供您期望的行为。

标签: c++ multidimensional-array initialization variable-length-array


【解决方案1】:

我不确定,但可能是因为矩阵的大小是动态的,编译器无法在编译时生成初始化程序。

【讨论】:

    【解决方案2】:

    s[m][n]={0} 初始化只有在编译时知道矩阵的大小时才有效,需要使用 memset 或循环来初始化这个矩阵。使用 memset 非常简单:memset(s,0,m*m*sizeof(int))

    【讨论】:

    • 问题标记为 C++,而不是 C。C++ 中不存在 VLA,您可以使用 std::fill
    【解决方案3】:

    此代码在标准 C++ 中无效,因为它不允许像这样在没有 new 的情况下创建动态数组。

    例如,这里是 VC++ 输出:https://rextester.com/VFVL26633

    ource_file.cpp(9): note: failure was caused by non-constant arguments or reference to a non-constant symbol
    source_file.cpp(9): note: see usage of 'm'
    source_file.cpp(14): warning C4552: '<<': operator has no effect; expected operator with side-effect
    source_file.cpp(18): error C2036: 'int [m][n]': unknown size
    

    如果你将n,m 设为 const,它将正常工作。

    使用std::vectornew/delete

    【讨论】:

    • 一些编译器支持 VLA 作为非标准扩展。
    • @Peter:没错,但这意味着你不能指望他们实现 same 非标准扩展。例如,这个确切的问题(零初始化)可能在编译器之间不一致。
    • @MSalters - 没有争论。我之前评论的上下文是这个答案的原始帖子,它使用了比现在更多的试探性语言。 (看起来答案在您发表评论前大约一小时被编辑为当前形式)。
    【解决方案4】:

    禁止以变量的形式分配静态矩阵/数组的大小。您必须在编译时给出大小或使用动态数组。

    #include <iostream>
    using namespace std;
    int main()
    {
        int i, j, s[4][4] = { 0 };
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 4; j++)
            {
                cout << s[i][j] << " ";
            }
            cout << endl;
        }
    }
    

    【讨论】:

      【解决方案5】:

      当你声明数组s 时,它的维度应该在编译时就知道了。 由于您没有显式初始化mn,它们都被一些随机值初始化并用于s 数组声明。 所以你的s 数组可以有任何随机维度(可能为零),在从cin 输入mn 之后,你可能只是在打印一些未初始化的内存单元。

      【讨论】:

      • 您可能需要重新检查代码。 mn 的值是从标准输入中读取的。无论如何,即使不是这种情况,它们也不会“使用随机值初始化”(未指定的行为),它们会未初始化(未定义的行为)。
      • mn 确实是从标准输入中读取的,但是对于编译时的数组声明,它们还没有标准输入中的值。对,变量未初始化,因此在数组声明时它们可以有任何值。
      • 这是一个 VLA(可变长度)数组。文档说不支持 VLA 的初始化,因此数组元素不会像常量大小数组那样用 0 填充
      【解决方案6】:

      使用空括号 {} 来初始化数组。默认情况下,这会将数组的所有元素初始化为 null。

      【讨论】:

        猜你喜欢
        • 2019-09-23
        • 2013-09-21
        • 2019-10-09
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多