code

함수의 VLA 배열 매개 변수에 정수 대신 별표([*])를 사용하는 이유는 무엇입니까?

starcafe 2023. 9. 15. 21:15
반응형

함수의 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

반응형