2016-12-01 24 views
0

memsetprintNGE関数内で使用すると、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; 
} 
+0

デバッガを使用してコードを実行すると、わかります。 –

+0

例外は-1です。 memsetは、データブロックのバイト単位の初期化を実行し、ループは要素を反復処理します。これは、-1(0xffffffff)以外の値が配列の状態が異なることを意味します。 – h4x0r

+0

コメントのビットを@ h4x0rで拡大するには、この 'memset'の使用は偶然にしか動作しません。配列を-1ではなく2に初期化してみてください。ここで 'memset'を使わないでください。実際、一般的に、 'memset'を使わないでください。 –

答えて

5

リセットされないforループのインデックス変数i。したがって、whileループは実行されません。

+1

ポイントを殺すだけです。 'memset()'を使うと、 'i'がインクリメントされないので、ループは期待どおりに動作します。 – Persixty

+0

ありがとうpurplepsycho! – newcoder191

関連する問題