Всегда получается ошибка сегментации - PullRequest
0 голосов
/ 20 июня 2019

Я должен найти максимальный неотрицательный подмассив, т. Е. Сумма элементов подмассива, содержащего только неотрицательные термины, должна быть максимальной. Если сумма 2 подмассивов максимальна, то сумма с максимальным массивомдлина должна быть напечатана. Если длина двух подмассивов одинакова, то следует выбрать подмассив с более низким начальным индексом.

Я передаю входной массив функции. Затем запускаю цикл.Сначала внутри этого цикла я гарантирую, что отрицательные члены, которые могут появиться в начале массива, не учитываются. Затем найдите сумму подмассива, содержащего неотрицательные члены, и найдите максимальную сумму.

void largestsubarr(int* A,int n1,int* len1){
    int i=0,j,k=0,count;
    A=(int*)malloc(sizeof(int)*n1);
    len1=(int*)malloc(sizeof(int)*n1);
    int subarr[n1][n1];
    int largest=0,max_cnt=0;
    while(i<n1){
        int sum=0;
        count=0;
        while(A[i]<0)
            i++;
            //The first non negative term

        while(A[i]>=0)
        {
            count++;
            sum+=A[i];
            i++;
        }
        if(sum>largest)
        largest=sum;
    }

    printf("The largest subarray sum : %d",largest);
    free(len1);
}
int main()
{
  int n;
  printf("Enter the no. of elements : ");
  scanf("%d",&n);
  int* a=(int*)malloc(sizeof(int)*n);
  int* res=(int*)malloc(sizeof(int)*n);
  printf("Enter the elements of the array :\n");
  for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
  printf("Address of a : %p",a);
  largestsubarr(a,n,res);
  free(a);
  free(res);
  return 0;
}

I am getting segmentation fault.Try to resolve it using gdb.Following is the output I get:

    Program received signal SIGSEGV, Segmentation fault.
    0x0000555555554a54 in largestsubarr (A=0x555500000000, n1=0, 
    len1=0x0)
        at q2.c:24
    24        sum+=A[i];

1 Ответ

0 голосов
/ 20 июня 2019
int subarr[n1][n1];

работает в стеке и, вероятно, ограничен. В зависимости от n1 вы получаете ошибку выделения памяти (если она вообще работает, используя неконстантное значение для локального объявления массива).

Выделите subarr также в динамическом 2D-режиме.

typedef int *PInt;
PInt* subarr=new PInt[n1];
for(int i=0;i<n1;i++) subarr[i]=new int[n1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...