【问题标题】:Using memset with multidimensional arrays in C++在 C++ 中将 memset 与多维数组一起使用
【发布时间】:2012-01-25 12:49:51
【问题描述】:

我正在尝试使用memset 设置大小为rownum x rownmum 的动态数组。但是,当我如下所示调用 showarr 函数时,我得到的不是全零输出(即 ASCII 48),而是随机/垃圾值。

void showarr(int **a, int rownum)
{
        for ( int i = 0; i < rownum; i++) {
                for ( int j = 0; j < rownum; j++) {
                        cout<<a[i][j]<<endl;
                }
        }
}

int main(int argc, char *argv[])
{
        int n;
        cin>>n;

        int rownum;
        cin>>rownum;
        int **a = new int* [rownum] ;
        for ( int i = 0; i <rownum; i++) {
             a[i] = new int[rownum];
        }
        for (int i = 0; i < rownum; i++) {
              memset(a[i],48,sizeof(a[i]));
        }
        showarr(a,rownum);

        return 0;
}

【问题讨论】:

  • sizeof(a) == size(int **),表示 4 或 8 个字节,具体取决于您的处理器。
  • 抱歉,有一个错字。我的意思是sizeof(a[i])
  • 你想做什么?一般来说,智能指针优于原始指针,向量优于数组,指针引用优于指针指针,std::fill() 优于 memset()。跨度>
  • 像您尝试使用 sizeof 一样仅适用于显式数组(即声明为 int a[10] 的变量)。

标签: c++ multidimensional-array memset


【解决方案1】:

sizeof(a[i]) == sizeof(int *); sizeof 运算符不能用于获取动态分配数组的长度。做

memset(a[i], '0', sizeof(a[i][0]) * rownum);

改为。

(请不要在代码中使用 ASCII 值作为幻数。)

【讨论】:

    【解决方案2】:

    请参阅 larsmans 关于问题所在的回答。 这很容易用向量替换(没有内存泄漏的机会)(未编译/测试):

    #include <vector>
    #include <iostream>
    
    typedef std::vector<int> vector1D;
    typedef std::vector<vector1D> vector2D;
    
    void showarr(const vector2D& v)
    {
            for (vector2D::iterator it1 = v.begin(); it1 != v.end(); ++it1) {
                    for (vector1D::iterator it2 = it1.begin(); it2 != it1.end(); ++it2) {
                            cout<<*it2<<endl;
                    }
            }
    }
    
    int main()
    {
            int rownum;
            cin>>rownum;
            vector2D a();
            for (int i = 0; i <rownum; i++) {
                 a.push_back(vector1D(rownum, '0'));
            }
            showarr(a);
    }
    

    【讨论】:

    • 这段代码的行为是不同的,但是:它将每个int设置为'0',而不是每个int中的每个字节。
    • @larsmans:正确,尽管在这种情况下这更符合预期。 (以及未编译/测试的部分)。
    猜你喜欢
    • 2021-12-14
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2013-01-09
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多