함수의 VLA 배열 매개 변수에 정수 대신 별표([*])를 사용하는 이유는 무엇입니까?
함수에서 매개 변수로 가변 길이 배열을 사용하는 경우
int sum(int n, int a[n]);
번째 파라미터를 를 하기 하기 ( )n
) 두 매개변수 의 를 합니다 ( )의a
). 그러나 매개 변수로 VLA에 사용되는 또 다른 프로토타입을 접했습니다.
int sum(int n, int a[*]);
그 이유를 이해하기가 정말 어렵습니다.*
됩니다 됩니다.n
에서 안에[]
?
[*]
구문은 기능 프로토타입을 선언할 때 사용됩니다.여기서 핵심적인 세부 사항은 기능 프로토타입에서 매개 변수 이름을 지정할 필요가 없고 각 매개 변수의 유형만 지정하면 된다는 것입니다.
예를 들어, 첫 번째 매개 변수를 이름을 지정하지 않은 채로 둔다면, 당연히 사용할 수 없을 것입니다.n
두 번째(array) 파라미터 선언에서.그러나 많은 경우 컴파일러에게 어떤 매개 변수가 VLA라고 말해야 합니다.이때가 바로.[*]
구문이 구조에 도움이 됩니다.
당신의 경우, 매개변수 이름을 생략하면 프로토타입은 다음과 같이 보일 수 있습니다.
int sum(int, int [*]);
그러나 구체적인 예에서 이 구문은 합법적이지만 꼭 필요한 것은 아닙니다.비 VLA 어레이와 마찬가지로int [n]
는 여전히가히과다다과olrl히s가개다int *
(비제한적인 경우에도터도당t)당r)n
). 즉, Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ
int sum(int, int []);
또는 로서
int sum(int, int *);
프로토타입은 여전히 그 목적을 달성할 것입니다. 즉, 함수 정의와 적절하게 일치할 것입니다.하며, θ, 1D θ θ θ VLA θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ,[*]
이러한 VLA 어레이에는 기능이 실제로 필요하지 않습니다.
[*]
2D VLA(또는 VLA에 대한 포인터)의 경우와 같이 유형의 "변수 배열도"가 손실되지 않는 상황에서 중요해집니다.예를 들어 다음과 같이 정의되는 함수
int sum2d(int n, int m, int a[n][m])
{
...
}
다음 중 하나로 시제품이 제작될 수 있습니다.
int sum2d(int, int, int a[*][*]);
int sum2d(int n, int, int a[n][*]);
int sum2d(int, int m, int a[*][m]);
int sum2d(int n, int m, int a[n][m]);
위의 모든 프로토타입은 기능 정의와 적절하게 일치합니다.
변수에 습관이 의 에 을 이 입니다 은 하지 입니다 하지 은 [*]
할 수 에.위의막을할수다기x다기수x할,을,euen위막의lx .
선언의 로 첫 번째 . 다시 말하지만, 파라미터 선언의 모든 배열의 경우와 마찬가지로, 첫 번째[]
는 항상 중요하지 않고 항상 포인터로 붕괴됩니다. 즉, 다음은 또한 위에 대한 유효한 동등한 프로토타입 선언임을 의미합니다.sum2d
int sum2d(int, int, int a[][*]);
int sum2d(int, int, int (*a)[*]);
int sum2d(int n, int m, int (*a)[m]);
두번째 입니다.[]
그것은 정말 중요하고 "기장"으로 선언되어야 합니다.
별을 실제 함수에 넣으면 이 오류가 발생합니다.test.c:3: error: ‘[*]’ not allowed in other than function prototype scope
입니다. . 에 은 에서 입니다 하는 VLA 를 입니다 하는 에서 *
변수 이름을 대신합니다.VLA.
여기서 당면한 문제는 VLA에 별 대신 변수를 넣으면 미신고 상태임을 알려주기 때문에 별은 c99가 이를 우회하기 위해 내장된 방식입니다.
언급URL : https://stackoverflow.com/questions/17371645/why-use-an-asterisk-instead-of-an-integer-for-a-vla-array-parameter-of-a-f
'code' 카테고리의 다른 글
printf("%x",1)가 정의되지 않은 동작을 호출합니까? (0) | 2023.09.15 |
---|---|
특정 WooCommerce 이메일 알림에 대한 보낸 사람 이름 및 이메일 주소 변경 (0) | 2023.09.15 |
mysql WHERE 절에서 "IN"의 값을 동적으로 추가하는 방법은? (0) | 2023.09.15 |
웹 응용프로그램용 파일 저장소:파일 시스템 대 DB 대 NoSQL 엔진 (0) | 2023.09.15 |
WooCommerce 단일 제품 페이지에 여러 탭 추가 (0) | 2023.09.15 |