C++11 为数组赋值:memset vs for循环

C++11 为数组赋值:memset vs for循环,c++11,memset,C++11,Memset,目前,当我试图给数组赋值时,我在memset和for循环之间遇到了问题。当我试图用for循环替换memset时,程序的输出是不同的。当我尝试memset时,我得到了5 bool visited[21][21]; int ans[21][21]; memset(ans,10000,sizeof(ans)); memset(visited,0,sizeof(visited)); 但当我试图用for循环替换memset时,我得到的输出是-1 bool visited[21][21]; int an

目前,当我试图给数组赋值时,我在
memset
和for循环之间遇到了问题。当我试图用for循环替换
memset
时,程序的输出是不同的。当我尝试
memset
时,我得到了
5

bool visited[21][21]; int ans[21][21];
memset(ans,10000,sizeof(ans));
 memset(visited,0,sizeof(visited));
但当我试图用for循环替换
memset
时,我得到的输出是
-1

bool visited[21][21]; int ans[21][21];
for(int a1=0;a1<21;a1++)
    {
        for(int b1=0;b1<21;b1++)
        {
            ans[a1][b1]=10000;
        }
    }


    for(int a1=0;a1<21;a1++)
    {
        for(int b1=0;b1<21;b1++)
        {
            visited[a1][b1]=0;
        }
    }

你不需要在C++中使用<代码> MyStuts<代码>,正如你刚刚发现的。 修正:

bool visited[21][21] = {}; // zero-initialize

int ans[21][21]; // uninitialized
std::fill_n(*ans, sizeof ans / sizeof **ans, 10000);

int ans[21][21]
不会创建一个21*21的数组,而是创建21个长度为21的数组。My memset的可能副本可以提供正确的输出,但lopp的输出不正确@mgetz您提供的代码不会输出任何内容。不要使用
memset
,不要使用内置数组,并避免使用循环。如果
std::fill\n
不能产生正确的结果,那就意味着你做错了什么。这就是为什么您不应该使用
memset
或手动循环的原因,因为它们经常隐藏您做错了什么的事实。将您的代码更改为使用
std::array
而不是内置数组,然后使用
std::fill\n
,并从此处开始使用。这将使它更容易以自然的方式得到正确的实现。我理解你的观点。但是问题是使用
memset
我得到了正确的输出。不是通过for循环或
fill\n
@Yonex您不可能获得
memset(…,10000,…)
的正确输出,不。除非您对正确的定义不正确。
bool visited[21][21] = {}; // zero-initialize

int ans[21][21]; // uninitialized
std::fill_n(*ans, sizeof ans / sizeof **ans, 10000);