memset
をprintNGE
関数内で使用すると、main()
の配列要素を-1に初期化するときにも正しい結果が得られ、正しい結果が得られます。forループを使ったmemset()と初期配列要素の違いは?
しかし、私はprintNGE
の関数をforループを使って初期化すると間違った答えが出ます。何らかの理由でwhileループのelse部分の中で配列要素の初期値が変更されていないようですね?このような相違の原因となる可能性があることを教えてください。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
using namespace std;
/* arr[] of size n */
void printNGE(int arr[], int n)
{
int i = 0;
stack <int> s;
int ans[n];
for(i=0;i<n;i++)//Set all the elements to -1
ans[i] = -1;
//memset(ans,-1,sizeof(ans));
while (i<n)
{
if(s.empty() || arr[s.top()]>arr[i])
s.push(i++);
else
{
ans[s.top()]=arr[i];
s.pop(); //pop till incoming element is greater
}
}
for(i=0;i<n;i++)
printf("%d -> %d\n",arr[i],ans[i]);
}
int main()
{
int arr[]= {11, 13, 21, 3};
int i;
int n = sizeof(arr)/sizeof(arr[0]);
//int ans[n];
//for(i=0;i<n;i++)//Set all the elements to -1
// ans[i] = -1;
printNGE(arr, n);
getchar();
return 0;
}
デバッガを使用してコードを実行すると、わかります。 –
例外は-1です。 memsetは、データブロックのバイト単位の初期化を実行し、ループは要素を反復処理します。これは、-1(0xffffffff)以外の値が配列の状態が異なることを意味します。 – h4x0r
コメントのビットを@ h4x0rで拡大するには、この 'memset'の使用は偶然にしか動作しません。配列を-1ではなく2に初期化してみてください。ここで 'memset'を使わないでください。実際、一般的に、 'memset'を使わないでください。 –