인프런 커뮤니티 질문&답변

이재완님의 프로필 이미지
이재완

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.17 변수로 길이를 정할 수 있는 배열

10-17. 변수로 길이를 정할 수 있는 배열

해결된 질문

작성

·

152

2

안녕하세요. 제가 설명하는 내용이 맞는지 몰라 질문드립니다.

제 설명의 틀린 부분을 지적해주시면 감사하겠습니다.

 

visual studio가 아닌 온라인 c compiler를 이용하면 가변 길이 변수를 사용할 수 있습니다.

가변 길이 변수를 이용하면,

int sum2d_4(int row, int col, int ar[row][col]) // row 생략 가능

{

    int r, c, tot = 0;

    for (r = 0; r < row; r++)

        for (c = 0; c < col; c++)

            tot += ar[r][c];

    return tot;

}

이와 같은 함수를 사용할 수 있습니다.

int sum2d_2(int ar[][COLS], int row)

{

    int r, c, tot = 0;

    for (r = 0; r < row; r++)

        for (c = 0; c < COLS; c++)

            tot += ar[r][c];

    return tot;

}

이 함수와 달리, symbolic constant(매크로)를 사용하지 않고 함수의 매개변수 만으로 배열 메모리에 접근하여 함수의 기능을 구현할 수 있는 것입니다.

따라서 VLAs의 기능을 통해,

int sum2d_3(int* ar, int row, int col)
{
    int r, c, tot = 0;
    for(r = 0; r < row; r++)
        for(c = 0; c < col; c++)
            tot += *(ar + c + col * r); // ar[c + col * r]
    return tot;
}

포인터를 이용한 위의 함수처럼, 매개변수 만으로 함수의 기능을 구현하고 배열 메모리에 접근할 수 있습니다.

다만, c언어에서 동적할당이 VLAs의 기능을 대체할 수 있고 컴파일러에 따라 VLAs가 불안정하게 작동할 수 있기 때문에 현재 visual studio에서는 사용이 막혀있습니다.

 

이상의 설명 중 틀린 부분을 지적해주시면 감사하겠습니다.

늘 친절하고 세세한 답변 감사합니다.

좋은 하루 보내세요!

답변 1

2

안녕하세요, 답변 도우미 Soobak 입니다.

전반적으로 설명해주신 말씀이 맞습니다.
가변 길이 배열(Variable Length Arrays, VLA)를 사용하면 함수의 매개변수 만으로 배열의 크기를 결정할 수 있습니다.

VLAs는 C99 표준에서 소개되었지만, 이후 C11 표준에서는 선택적 기능으로 간주되었으며, 말씀하신대로 Visual Studio 는 VLA 를 지원하지 않는 컴파일러 중 하나입니다.
하지만, 다른 C99 표준을 지원하는 컴파일러들 또한 VLAs 의 사용이 가능하므로, '온라인 c 컴파일러' 에만 VLAs 의 사용을 국한하는 것은 조금 부정확하다고 생각합니다.

나머지 설명들은 적절한 것 같습니다. 👍👍

 

이재완님의 프로필 이미지
이재완

작성한 질문수

질문하기