해결된 질문
작성
·
158
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 의 사용을 국한하는 것은 조금 부정확하다고 생각합니다.
나머지 설명들은 적절한 것 같습니다. 👍👍