2013-12-05 3 views
1

Когда я предоставляю ввод для std::cin >> diff;, он принимает входное значение, а в момент ввода значения массива значение переменных переменных изменяется и устанавливает значение 4th element массива. Пожалуйста, помогите мне, где это происходит. Я пробовал с fflush(std). Но это мне не помогло.Как автоматически присваивается присвоенное значение переменной?

Я пользуюсь Visual Studio 2010 Ultimate edition.

#include "stdafx.h" 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int i, num;//[]={0}; 
    int diff = 0; 
    int numset[] = {0}; 
    int temp, cnt; 
    cnt = num = i = 0; 
    std::cout << "Enter your number and difference : "; 
    //fflush(stdin); 
    std::cin >> num ; 
    std::cin >> diff; 
    cout << "Enter array Elements : \n"; 
    for(i = 0; i < num; i++) 
    { 
     cin >> numset[i]; 
     //fflush(stdin); 
    } 
    for(i = 0; i < num; i++) 
    { 
     for(int j = i; j < num; j++) 
     { 

      if(i == j) 
      { 
       temp = numset[j]; 
      } 
      else 
      { 
       if((diff == (numset[j] - temp)) || (((-1)*diff) == (numset[j] - temp))) 
       { 
        cnt++; 
       } 
      } 
     } 
    } 
    cout << cnt << endl; 
    system("pause"); 
    return 0; 
} 
+0

@JoachimPileborg: выброс ошибки как, размер массива должен быть больше, чем '0' –

+0

' fflush (stdin) 'is UB. – chris

ответ

3

Вы получаете доступ за пределы массива numset, так что ваш код Неопределенное поведение (UB) и что-нибудь может случиться. Он может перезаписывать переменные в стеке (как в вашем случае), он может упасть, он может заказать пиццу онлайн.

numset объявлен как одноэлементный массив, поэтому доступ к numset[i] для i > 0 приводит к UB. Вероятно, вы должны изменить numset как std::vector<int> и использовать push_back(), чтобы добавить в него номера.

+0

Я понял, что если я возьму «вектор», тогда все станет проще, но почему он устанавливает «4-й элемент массива» переменной 'diff'? –

+0

@RasmiRanjanNayak, * Он может перезаписывать переменные в стеке (как в вашем случае) * – chris

+0

@RasmiRanjanNayak * Неопределенное поведение не определено. * Тем не менее, возможно, что компилятор представил некоторые дополнения между переменными стека, так что есть один 'int' из 'numset', затем 12 байтов заполнения, затем один int' diff'. Таким образом, доступ к 'diff' также можно рассматривать как доступ к' num [4] 'и наоборот. – Angew

Смежные вопросы