동적배열을 이렇게 선언하면 안되는 이유가 있나요?

조회수 487회

배열의 크기는 컴파일시 정해지기에 동적크기의 배열을 선언하려면

int size;
scanf("%d", &size);
int* arr = (int*)malloc(sizeof(int) * size);

이렇게 하라고 배웠는데 아래와 같이 코딩해도 문제없이 돌아갑니다. (c, cpp )

int size;
scanf("%d",&size);
int arr[size];

컴파일시 배열의 크기가 정해지지 않는데도 문제 없이 프로그램이 돌아가는 이유와, 저것이 된다면 이런 경우에서 굳이 malloc과 같은 동적할당을 사용하지 않고 아래처럼 코딩하는 습관을 가져도 문제가 없을지 , 그리고 혹시 c와 cpp에서의 차이점이 있다면 알고싶습니다.

  • C를 전혀 모르지만.. 바로 이게 c와 cpp의 차이인 거 같아요. 대충 검색해 보니, 위를 "C 버전", 아래를 "C++ 버전"이라고 부르는 페이지가 나오네요. https://cplusplus.com/forum/articles/416/ "아래와 같이 코딩해도 문제없이 돌아"가는 이유는 지금 코딩하고 계신 그것이 C가 아니라 C++이기 때문인 거고요. 엽토군 2023.1.10 15:27
  • 아랫 방식이 c에서도 컴파일 돼요 질문에 추가했습니다 mssak 2023.1.10 16:06

3 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    https://wikidocs.net/27184

    C에도 표준이 있는데, 어떤 표준을 쓰느냐에 따라 다릅니다.

    이런 문법을 VLA (variable length array) 라 하는데, C99 에서는 가능하고, 그 이전에서는 불가능하다고 하네요.

  • C는 컴파일타임에 배열의 크기를 결정합니다. 그래서 런타임에 결정되는 방시으로는 쓸 수 없스니다. 동적 할당을 해줘야 합니다.

    최근 컴파일러나 C++에서는 런타임에 배열이 생성될 때 내부에서 동적할당을 해주는 로직으로 변경해주게 됩니다. 덕분에 조금 더 편하고 안전해 진거죠.

  • chat gpt에 본문 내용 그대로 복사해서 물어보니까 아래와 같은 답을 얻었습니다 답 해주신분들 감사합니다.

    C와 C++에서는 VLA(Variable Length Array)라는 기능이 있기 때문에, 변수로 크기를 지정해서 배열을 선언할 수 있습니다. 이 기능은 C99부터 지원되었으며, C++11부터도 지원됩니다.

    하지만 VLA는 일반적으로 권장되지 않는 기법입니다. 컴파일러마다 구현이 다를 수 있으며, 작은 프로그램에서는 문제가 없지만 대규모 프로그램에서는 성능이나 메모리 문제를 일으키는 경우가 있습니다.

    동적할당 기법인 malloc과 같은 함수를 사용하면 메모리를 원하는대로 할당하며, 작은 프로그램에서도 큰 프로그램에서도 안정적인 성능을 보장할 수 있습니다.

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

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

(ಠ_ಠ)
(ಠ‿ಠ)