在 C++ 中将 memset 与多维数组一起使用
Posted
技术标签:
【中文标题】在 C++ 中将 memset 与多维数组一起使用【英文标题】:Using memset with multidimensional arrays in C++ 【发布时间】: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]
的变量)。
【参考方案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:正确,尽管在这种情况下这更符合预期。 (以及未编译/测试的部分)。以上是关于在 C++ 中将 memset 与多维数组一起使用的主要内容,如果未能解决你的问题,请参考以下文章