동적으로 할당 된 배열과 정적 배열의 차이점

Anon 123

동적 메모리 할당에 대한 소개를 받고 있는데 동적 배열 ( int *p = new int[n] \\ where n is the user input describing the number of elements사용자가 원하는 크기의 배열을 사용자가 필요로하는 / 선언하는 요소 수를 모를 때 사용되는 것과 같은 것) 이 사용 된다는 것을 배웠습니다 . 그러나 대신 이렇게하면 다음과 같이 정적 배열을 선언 할 수 없습니다.

int n;
    cout << "Enter the size : " <<endl;
    cin>>n;
    int a[n];

이 경우 동적 배열의 장점은 무엇입니까? 나는이 개념을 이해하지 못한다.

편집 : 귀하의 답변에 감사드립니다. 일부 사용자는 a [n]을 입력하여 배열을 선언하는 것은 허용되지 않는다고 응답했습니다. 그러나 다음 코드를 입력하면 프로그램이 제대로 실행되는 이유는 무엇입니까?

int main(){
    int n;
    cout << "Enter the size : " <<endl;
    cin>>n;
    int a[n];
    cout << "Enter your numbers : " <<endl;
    for (int i=0;i<=n;i++){
        cin>>a[i];
    }
    for (int i=0;i<=n;i++){
        cout<<a[i]<<endl;
    }
}
추적

이제 사람들은 이미 int a[n]유효한 C ++가 아니라고 말했습니다 . 그러나 아마도 당신이 찾고 있는 답으로 당신을 도울 수있을 것 입니다.

이 경우 동적 배열의 장점은 무엇입니까?

이 구문을 int a[n]VLA (Variable Length Array)라고합니다. 이것은 C ++에서는 불법이지만 C에서는 허용됩니다. 따라서 기술적 인 차이 또는 VLA의 단점에 초점을 맞추겠습니다.

먼저 명백한 것을 제거합시다. C89 이전에는 VLA가 없었으므로 동적 할당은 가변 길이 메모리를 할당하는 유일한 방법이었습니다.

한 가지 더, 정적 배열과 심지어 VLA도 스택에 할당됩니다 (이는 구현이 정의 되었지만 스택에있는 경우가 많음). 반면 동적 배열은 힙에 할당됩니다. 스택과 힙에 대한 자세한 내용은 읽기

이제 VLA는 아주 좋은 이유로 C ++에서 금지됩니다. VLA는 모든 종류의 정의되지 않은 동작을 유발할 수 있으며 수행중인 작업을 정확히 알지 않는 한 항상 피해야합니다. 그리고 "당신이 무엇을하고 있는지 정확히 알고있다"는 것은 VLA의 크기 인수가 스택을 넘치지 않을 것이라는 것을 알고 있다는 것을 의미합니다.

VLA C ++에서 허용 되었다고 가정 합니다.이 줄은 코드에서

cin>>n;
int a[n];

사용자가 n스택 크기보다 훨씬 더 큰 규모를 입력하면 어떻게됩니까? 이는 보장 된 스택 오버플로입니다. 문제가 보이십니까? 힙에 비해 스택은 매우 작습니다. 이것도 여기여기에 설명 되어 있습니다 .

그리고 블라스는 피해야한다 주된 이유입니다. VLA는 실제로 앞서 언급 한 것보다 훨씬 더 붐을 일으키지 만. 난 항상 편리 블라스와 관련된 UE들 목록을 유지 가리키고, 그냥 거기 이다 많은 문제.

그래서 내 요점으로 돌아가서

무슨 일을하는지 정확히 알지 못한다면 [VLA]는 항상 피해야합니다.

솔직히 VLA를 절대 사용 해서는 안되며 표준 C ++도 아니기 때문에 사용할 수 없습니다. 그러나 스택 할당은 종종 힙 할당보다 빠릅니다. 이유가 아니더라도 당연하다고 생각할 수도 있습니다. 이것을 읽으십시오 . 당신은 C (안 C ++)에 있다면 당신은 그래서 가끔하는 VLA 안전 사용하는 유일한 시간은 의 최대 크기 nint a[n]수 없습니다 스택 오버 플로우 VLA의 선언이 범위의 상단에 당신 현재에서 선언하고 있습니다. alloca(c99 이전에 VLA를 사용하는 유일한 방법이었던) 제작자는 동의하는 것 같습니다.

여기 에서 발췌 -

다음과 같은 형식으로 alloca ()를 사용할 수 있습니다.

pointer_variable = alloca (표현식);

함수가장 바깥 쪽 블록에있는 표현식 문으로 .

아 그리고 당신의 편집에 답하기 위해 :

답변 해 주셔서 감사합니다. 일부 사용자는 a [n]을 입력하여 배열을 선언하는 것은 허용되지 않는다고 응답했습니다. 그러나 다음 코드를 입력하면 프로그램이 제대로 실행되는 이유는 무엇입니까?

컴파일러가 허용하기 때문입니다. 그러나 표준은 그렇지 않습니다. 그래서 이런 종류의 것들은 좋은 ol ' "내 기계에서 작동했습니다!"를 낳을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++ 동적으로 할당 된 2 차원 배열 삭제

분류에서Dev

동적 및 정적으로 할당 된 배열 요소 계산?

분류에서Dev

동적으로 할당 된 배열에 대한 이진 검색

분류에서Dev

동적으로 할당 된 배열에 대한 이진 검색

분류에서Dev

이 배열은 동적으로 할당 된 배열과 어떻게 다른가요?

분류에서Dev

동적으로 할당 된 배열 크기 조정

분류에서Dev

동적으로 할당 된 배열의 끝

분류에서Dev

동적으로 할당 된 배열의 크기 찾기

분류에서Dev

동적으로 할당 된 배열의 요소에 액세스

분류에서Dev

동적으로 할당 된 배열의 포인터 변경

분류에서Dev

C에서 동적으로 할당 된 문자열 배열

분류에서Dev

동적으로 할당 된 배열에 문자열 쓰기

분류에서Dev

동적으로 할당 된 char 배열이있는 C ++ 구조체

분류에서Dev

동적으로 할당 된 배열과 단일 포인터 삭제

분류에서Dev

동적으로 할당 된 배열을 포함하는 구조체 배열을 동적으로 할당

분류에서Dev

포인터 산술을 사용하여 배열 크기를 찾을 때 동적으로 생성 된 배열 (int * arr)과 정적으로 생성 된 배열 (int arr [])의 차이점

분류에서Dev

Segmentation Fault 동적으로 할당 된 구조 배열

분류에서Dev

동적으로 할당 된 배열 사용 중 오류

분류에서Dev

Segmentation Fault 동적으로 할당 된 구조 배열

분류에서Dev

C ++에서 동적으로 할당 된 배열

분류에서Dev

동적으로 할당 된 std :: vector 배열 만들기

분류에서Dev

동적으로 할당 된 배열 읽기 및 쓰기

분류에서Dev

char 배열과 int 배열의 구조체를 동적으로 할당

분류에서Dev

효율성 : 동적 할당과 일정한 길이 배열

분류에서Dev

동적으로 할당 된 배열을 포함하는 구조의 Segfault

분류에서Dev

동적으로 할당 된 배열의 범위를 벗어남 오류

분류에서Dev

C에서 동적으로 할당 된 2D 문자 배열을 채우는 동안 이상한 동작

분류에서Dev

이니셜 라이저 목록을 사용하여 동적으로 할당 된 배열의 배열 크기 선언

분류에서Dev

이니셜 라이저 목록을 사용하여 동적으로 할당 된 배열의 배열 크기 선언

Related 관련 기사

  1. 1

    C ++ 동적으로 할당 된 2 차원 배열 삭제

  2. 2

    동적 및 정적으로 할당 된 배열 요소 계산?

  3. 3

    동적으로 할당 된 배열에 대한 이진 검색

  4. 4

    동적으로 할당 된 배열에 대한 이진 검색

  5. 5

    이 배열은 동적으로 할당 된 배열과 어떻게 다른가요?

  6. 6

    동적으로 할당 된 배열 크기 조정

  7. 7

    동적으로 할당 된 배열의 끝

  8. 8

    동적으로 할당 된 배열의 크기 찾기

  9. 9

    동적으로 할당 된 배열의 요소에 액세스

  10. 10

    동적으로 할당 된 배열의 포인터 변경

  11. 11

    C에서 동적으로 할당 된 문자열 배열

  12. 12

    동적으로 할당 된 배열에 문자열 쓰기

  13. 13

    동적으로 할당 된 char 배열이있는 C ++ 구조체

  14. 14

    동적으로 할당 된 배열과 단일 포인터 삭제

  15. 15

    동적으로 할당 된 배열을 포함하는 구조체 배열을 동적으로 할당

  16. 16

    포인터 산술을 사용하여 배열 크기를 찾을 때 동적으로 생성 된 배열 (int * arr)과 정적으로 생성 된 배열 (int arr [])의 차이점

  17. 17

    Segmentation Fault 동적으로 할당 된 구조 배열

  18. 18

    동적으로 할당 된 배열 사용 중 오류

  19. 19

    Segmentation Fault 동적으로 할당 된 구조 배열

  20. 20

    C ++에서 동적으로 할당 된 배열

  21. 21

    동적으로 할당 된 std :: vector 배열 만들기

  22. 22

    동적으로 할당 된 배열 읽기 및 쓰기

  23. 23

    char 배열과 int 배열의 구조체를 동적으로 할당

  24. 24

    효율성 : 동적 할당과 일정한 길이 배열

  25. 25

    동적으로 할당 된 배열을 포함하는 구조의 Segfault

  26. 26

    동적으로 할당 된 배열의 범위를 벗어남 오류

  27. 27

    C에서 동적으로 할당 된 2D 문자 배열을 채우는 동안 이상한 동작

  28. 28

    이니셜 라이저 목록을 사용하여 동적으로 할당 된 배열의 배열 크기 선언

  29. 29

    이니셜 라이저 목록을 사용하여 동적으로 할당 된 배열의 배열 크기 선언

뜨겁다태그

보관