Почему отрицательное значение дает ошибку сегментации для программы, которая должна найти пары значений из массива, который имеет данную сумму? - PullRequest
0 голосов
/ 13 марта 2011
#include <stdio.h>

void findpairs(int arr[], int arr_size, int sum)
{
  int i, temp;
  int hash[100] = {0}; 

  for(i = 0; i < arr_size; i++)
  {
    temp = sum - arr[i];
    if(hash[temp] == 1)
    {
      printf("Pair with given sum %d is (%d, %d) \n", sum, arr[i], temp);
    }
    hash[arr[i]] = 1;
  }
}

int main()
{
    int A[] = {4,-4,9,2,1,6,5,11};
    int sum =7;
    int arr_size = 8;
    findpairs(A, arr_size, sum);
    return 0;
}

ссылка на ту же программу

Ответы [ 3 ]

2 голосов
/ 13 марта 2011
hash[arr[i]] = 1;
...
hash[-4] = 1;

Ваш массив hash имеет индексы от 0 до 99, так что вы получаете доступ к недопустимым данным.

Ваш следующий за пределами доступа будет значение 9,

temp = 7 - 9;
if (hash[temp] == 1)
0 голосов
/ 13 марта 2011

temp = sum - arr[i]

Что если sum < arr [i]?hash[temp] == 1 будет работать с ошибками в большинстве реализаций.

Аналогичное поведение в случае hash[arr[i]] = 1;, если arr[i] отрицательно.

Технически говоря, доступ к элементу массива вне границ вызывает неопределенное поведение.

0 голосов
/ 13 марта 2011

Потому что попытка получить доступ к отрицательному индексу - это плохо.

temp = sum - arr[i];
if(hash[temp] == 1)

или

hash[arr[i]] = 1;
...