2016-09-07 6 views
2

큰 데이터를 입력하려고 할 때만 오류가 발생합니다. 많은 자원을 읽은 후에 다음과 같이이 오류의 원인을 발견했습니다 : 1. 우리가 허용되지 않은 메모리 위치를 건드렸다. 2. 우리가 예약하지 않은 메모리에 free()를 사용하거나 포인터를 두 번 free()합니다. 3. (부정적인 인덱스 배열을 만드는 등의) 유효하지 않은 인덱스를 초기화 내 코드 -이 오류의 원인이 될 수있는 하나의 원인을 발견내 C 코드에서 SIGABRT 오류의 원인은 무엇이며이를 극복하는 방법은 무엇입니까?

링크 - https://discuss.codechef.com/questions/59703/prime-number-generation-sigabrt-problem-c

"이 제한 될 수 있습니다 says- on n은 꽤 큽니다! atmost은 온라인 심사 위원을 위해 10^8 크기의 배열을 만들 수 있습니다. 주 기능의 힙 메모리 즉, 주 기능 외에도 10^7 크기의 배열을 만들 수 있습니다. 런타임 오류가 발생합니다 배열에 10^8 개 요소를 사용하지 마십시오. :)

당신이 시도하는 질문에서 상한선은 10^9입니다. 그 크기의 배열을 만들 수 있습니다. 그게 왜 내가 알게 당신이 다음 메모리 제한. "

을 초과 내가

int main(void) 
{ 
    int test_cases; 
    scanf("%i",&test_cases); 

    for (int i=0; i<test_cases; i++) 
    { 
     findresult(i); 
    } 

void findresult(int i) 
{ 
     int relations; // of the size 10^6 
     scanf("%i",&relations); 

     int* pair1 = malloc(sizeof(int)*relations); 
     int* pair2 = malloc(sizeof(int)*relations); 
     for (int j=0; j<relations; j++) 
     { 
      scanf("%i %i",&pair1[j],&pair2[j]); 
     } 

를 this-하는 선언과 입력 부분을 수정 의미 SIGABRT 오류입니다 관계 INT 큰 배열 int pairs[relations][2]을 (만들기 10^6) 스택 메모리에이 오류가 발생하고 주요 함수 자체에서 같은 큰 배열을 만드는 또한 오류가 발생합니다. 그래서 위의 코드에서 볼 수 있듯이, 나는 함수를 만들고 힙에 메모리를 할당했습니다. , malloc (pair1 및 pair2) 사용하고 있습니다. 여전히 동일한 오류가 발생하고 있습니다. 또한 작은 데이터를 잘 작동하는 것처럼 나머지 코드에서 오류가 없습니다. 문제가 큰 크기의 배열을 만드는 관련된 참으로 그때 문제를 극복하는 방법을 도와주세요.

EDIT 1- 코드 설명 - 모든 테스트 케이스 "i"에 대해 "findresult"함수가 호출됩니다. 모든 "i"에 대해이 함수는 두 개의 정수에 대한 입력을 취하고 두 번째 입력 "관계"에 따라 두 개의 정수 "크기"배열을 선언합니다. 그런 다음 두 배열의 모든 요소에 대해 사용자 입력을 입력하십시오. 나머지 함수들은 단지 배열을 읽고 몇몇 조건을 검사하는 것만 포함합니다.

편집 2 모든 데이터를 먼저 저장 한 다음 모든 데이터의 정확성이 필요한 조건 확인을 수행해야합니다. 나는 그것을 하나 하나 처음에는

+1

링크의 코드는 채우기 대신'n [번] (버퍼의 경계 외부에있는) [start [n]]에 씁니다. 그리고 게시 한 코드는 [MCVE] (http://stackoverflow.com/help/mcve)가 아닙니다. – StoryTeller

+0

예, 당신은 그 코드에 대해 옳았습니다. 그러나 그 링크를 제공하려는 제 목적은 정보의 출처가 괜찮은 포럼의 높은 레버 기여자임을 보여주는 것이 었습니다. 그리고 내가 문제를 분명하게하기 위해 게시 한 코드에 대한 설명을 해주었습니다. –

+0

다시 mcve 문제를 참조하십시오. 문제 코드에 대한 설명을 그만 두십시오. 가능한 가장 작은 예제로 보여주십시오. – StoryTeller

답변

1

(즉, 다음 다음 두 번째 등등 검사를 수행 모두 배열의 첫 번째 요소를 복용) 할 수없는 이유는, 당신은 정말, malloc의 반환 값을 확인해야합니다 특히 당신이 많은 메모리 덩어리를 할당하고 있다면.

메모리를 할당 할 수없는 경우 NULL을 반환합니다. 역 참조를 시도하면 정의되지 않은 동작이 발생합니다.

그런 경우 은 파일을 저장하고 한 번에 파일의 섹션 만로드하는 것과 같이 이 메모리를 소모하지 않도록 데이터를 저장하는 방법을 찾아야합니다.

또한 실제로는 두 항목을 검사하기 위해 scanf의 반환 값을 확인해야합니다. 따라서 friends 및/또는 relations이 임의의 값으로 설정 될 수 있습니다.

다른주의 사항은 실제로 내 할당 된 메모리를 해제하는 것입니다. 은 전체 기능을 표시하지만 main의 루프로 돌아 가기 전에 메모리를 해제하지 않으면 수백 메가 바이트 (예 : int 유형이 4 바이트 길이라고 가정 할 때 약 8MB)의 메모리 누수가 발생할 수 있습니다. 그 루프를 통해 시간. test_cases에 입력 한 값에 따라 메모리를 빨리 소모 할 수 있습니다.

+1

유효하지 않은 포인터를 통한 접근은'SIGBRT'가 아닌'SIGSEGV'를 야기합니다. – Sergio

+0

@Serhio : 그렇습니다. 그러나 어떤 * 행동도 * 결과로 나타날 수 있습니다. 결국, "정의되지 않은"의미는 :-)을 의미합니다. 즉, 실제 문제와 상관없이 이러한 사항을 확인해야합니다. – paxdiablo

+0

scanf에 관해서는 내가 두 값을 스캔하고 있음을 확인했습니다. 파일 I/O를 허용하지 않는 웹 사이트에서 코드를 제출해야합니다. 이 문제를 해결할 다른 방법이 있습니까? –