코린이 c언어 질문이요! 이중배열 동적할당으로 NxN 배열을 만드는데, N이 커지면 예외가 발생.

조회수 580회
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
    int N, ** p, a, b;
    printf("N : ");
    scanf("%d", &N);
    p = (int**)malloc(sizeof(int*) * N);
    for (a = 0; a < N; a++) {
        p[a] = (int*)malloc(sizeof(int) * N);
    }
    for (a = 0; a < N; a++) {
        for (b = 0; b < N; b++) {
            p[a][b] = 1;
        }
    }
    return 0;
}

이미지

인터넷 보고 이중배열 동적할당 공부하던중에 이렇게 코드를 짜보았는데, N을 20000? 정도까지 넣었을때는 문제없이 넘어가는데 22000?정도만 넘어가면 이렇게 오류가 뜨면서 실행이 안되네요.

사진은 N=30000넣었을 때 입니다.

인터넷 찾아보고 프로젝트 설정에서 스택 예약 크기라는것도 키워보고 했는데 변하는게 없네요. 그것외에 따로 설정 건드린건 없습니다.

뭐가 문제일까요?

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    malloc 함수가 무한정 성공할 수 없습니다.

    메모리를 다 써서 malloc 이 17562번째에는 실패하고 NULL 을 반환했고, p[17562] 에는 NULL 포인터가 할당되었고, 따라서 p[17562][0] 에 값을 쓸 수가 없는 것입니다.


    int 가 4바이트라고 하면

     >>> 2*1024*1024*1024
    2147483648
    >>> 4 * 30000 * 17562
    2107440000
    

    대략 2기가가 좀 안 됩니다.

    32비트 프로세서의 가상메모리 공간이 2기가입니다. 그 크기랑 비슷하고요.

    가장 간단한 해법은 64비트 빌드로 만들어서, 64비트 프로세스로 실행시키는 방법이겠습니다.

    • 메모리를 다 썼다고 하셨는데 그러면 혹시 다 썼다는게 실제로 제 컴퓨터 메모리 100퍼센트를 다 쓴건가요 아니면 프로그램에서 설정해둔 메모리 제한을 다 쓴건가요? 후자라면 혹시 그 제한을 늘릴 수 있는 방법이 있을까요? 30000*30000 배열을 만들려고 했던거라서... 박설 2021.3.19 18:07

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)