pkpawan123 Ответов: 2

Почему я получаю ошибку SIGSSEGV .мой код работает правильно на другие среды разработки


Мой код работает правильно на других комплайнерах и ide и дает правильный вывод, но когда я пытаюсь отправить свой код, он показывает ошибку SIGSEGV.

Что вызывает ошибку SIGSEGV и почему она не отображается другими компиляторами?

Что я уже пробовал:

#include <iostream>
#include<vector>

using namespace std;

int main()
{
    int T,i,N,M,Q,j,k,NEW[300][300],X,Y;
    cin>>T;
    
    while(T--)
    {
        cin>>N>>M>>Q;        
         
        for(i=1;i<=N;++i)
        {
            for(j=1;j<=M;++j)
            {
               NEW[i][j]=0; 
            }
        }
        
        for(i=1;i<=Q;++i)
        {
            cin>>X>>Y;            
            
        for(k=X;k<=X;k++)
        {
            for(j=1;j<=M;j++)
            {
                NEW[k][j]+=1;
            }
        }
        
        for(j=Y;j<=Y;j++)
        {
            for(k=1;k<=N;k++)
            {
                NEW[k][j]+=1;
            }
        }        
        }
       
        int c;
        c=0;
        
        for(i=1;i<=N;++i)
        {
            for(j=1;j<=M;++j)
            {
               if(NEW[i][j]%2!=0)
               {
                   c++;
               }
            }
        }
        
        cout<<c<<" \n";        
    }

    return 0;
}

[no name]

я не опубликовал этот вопрос, так как мне не нужно решение . мне просто нужно знать, почему эта ошибка вызвана и как ее удалить, поскольку она не показана другими компиляторами и ide

Mohibur Rashid

в c/c++ индекс массива начинается с 0, а не с 1 <---- причина, по которой ваше приложение выдает ошибку нарушения доступа к памяти.
у вас нет никакой проверки на значение N и M

KarstenK

на какой ide этот код работает правильно? пожалуйста, ответьте!

[no name]

https://www.onlinegdb.com/online_c++_компилятор

CPallini

Почему вы пишете C-подобный код на C++?

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Ваши циклы должны быть от 0 до <N, или <M, а не <=N или <=M.

Если вы хотите иметь в своем массиве 10 элементов, то они должны быть пронумерованы от 0 до 9, а не от 1 до 10.


Рейтинг:
0

Patrice T

Цитата:
Что вызывает ошибку SIGSEGV и почему она не отображается другими компиляторами?

SIGSEGV-это ошибка времени выполнения, говорящая о том, что вы пытаетесь получить доступ к памяти, которой не владеете.
Разные компиляторы по-разному справляются с выделением памяти, так что в зависимости от выбора компилятора, неправильное чтение/запись вне массива все еще будет в вашей памяти или нет.

Если M или N поднимутся до 300, вы будете выбрасывать память за пределы массива, что приведет к потенциальному неправильному результату.
Один из способов решить эту проблему-добавить 1 к размеру массива
int NEW[301][301];

Это нормально с игрушечными программами, но их следует избегать как можно больше.