此代码中的分段错误

时间:2017-05-20 12:51:09

标签: c segmentation-fault

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

void sort(int a[], int n)
{
  int i, j;
  for (i = 0; i < n - 1; i++)
    for (j = i; j < n - 1; j++)
      if (a[j] > a[j + 1])
        a[j] = a[j + 1] - (a[j + 1] = a[j]);
}

int call(int i, int hit, int t, int h[], int n, int count)
{
  static int max = 0;

  if (t <= 0)
  {
    if (count > max)
      max = count;
    return max;
  }

  if (h[i] > 0)
  {
    h[i] -= hit;
    if (h[i] <= 0)
      count++;
    max = call((i + 1) % n, hit, t - 1, h, n, count);//this is line where illegal access to memory is being made
    count--;
    h[i] += hit;
  }

  max = call((i + 1) % n, hit, t, h, n, count);
  return max;
}

int getMaxMonsters(int n, int hit, int t, int h[]) {
  sort(h, n);
  int m = call(0, hit, t, h, n, 0);
  return m;
}

int main() {
  int n;
  int hit;
  int t;
  scanf("%d %d %d", &n, &hit, &t);
  int h[100000];

  for (int h_i = 0; h_i < n; h_i++) {
    scanf("%d", &h[h_i]);
  }

  int result = getMaxMonsters(n, hit, t, h);
  printf("%d\n", result);
  return 0;
}

此代码计算可以杀死的最大怪物数量。

  • n不是。怪物
  • hit是命中值
  • h[]包含每个怪物的健康值
  • t是可用的总时间

因此,必须在t秒内杀死最大数量的怪物,并且每秒只能杀死一个怪物。 我因非法访问内存而出现分段错误。无法理解我是如何跨越数组限制的。

1 个答案:

答案 0 :(得分:0)

询问您的调试器或使用Valgrind。 它会自动检测内存管理错误。它还详细介绍了您的程序。

使用Valgrind太简单了。