2014-10-14 3 views
1

나는 C에서 우리가 쓸 수 있다면 알고 :왜 C 배열의 첫 번째 차원이 컴파일러에서 함수 매개 변수로 무시됩니까?

void myFunction(int x[30]) // 30 is ignored by the compiler 

void myFunction(int x[][30]) // 30 is not ignored here but if I put say '40' in the first dimension 
          // it would be ignored. 

이유는 첫 번째 차원은 컴파일러에 의해 무시가된다?

+0

C 배열은 경계 검사를 수행하지 않으므로 첫 번째 차원이 무시되지 않는다는 것은 무엇을 의미합니까? 컴파일러는 무엇을 할 것인가? – ruakh

+0

@ruakh 원형 인수. 형식이 일치하면 다른 호환되지 않는 크기의 배열을 전달할 수 없습니다. 또한, 크기 정보가있는 경우'sizeof' 연산자를 사용하여 배열 길이를 얻을 수 있습니다. – juanchopanza

+0

@ juanchopanza : "원형 논증"이 무슨 뜻인지 잘 모르겠습니다. C 배열은 동일한 함수에서 선언되고 사용될 때라도 경계 검사를 수행하지 않습니다.(당신의 다른 예제는 좋은 것들입니다.) – ruakh

답변

0

언어에 따라 무시되거나 쓸모가 없습니다. 컴파일러에서는 무시할 수 있습니다.

는 경우 myFunction이 내부에서, 당신은 쓰기 :
 ... x[29] ... 

가 유효한 프로그램을 얻을.

당신이

 ... x[30] ... 

프로그램이 보증되지 동작을 작성하는 경우. 컴파일러는 이것을 검사 할 수도 있고하지 않을 수도 있습니다.

컴파일러가 항상 모든 것을 검사 할 수는 없다는 사실은 C가 컴퓨터와 가까운 언어를 사용하는 데 드는 비용입니다. 배열은 다음 이름을 배열 어레이의 첫 번째 요소 포인터 컴파일러에 의해 처리되어 작동 매개 변수로서 사용될 때

+0

컴파일러는 함수에 전달 된 매개 변수를 검사하지 않지만 함수 시그니처를 읽는 프로그래머에게 정보를 전달합니다.이 함수는 첫 번째 매개 변수로 (적어도) 30 개의 정수 배열 (주소) 정수에 대한 포인터가 아닙니다. – tomlogic

+1

사실이 질문은 * 컴파일러가이 값을 "무시"하는 이유입니다. –

+0

그러나이 경우 컴파일러에서 크기 *를 무시합니다. 형식은 'T t [N]'의 매개 변수가 " 유형 T의 정규화 된 포인터"로 조정됩니다. '[] '사이에 한정자가 없으므로 단지'T * t'입니다. 고려해야 할 크기가 없기 때문에 컴파일러는 크기를 무시합니다. – juanchopanza

3
void myFunction(int x[30]) 

void myFunction(int *x) 

즉, 동일하다. 이 경우 첫 번째 치수의 길이는 아무 소용이 없습니다.
이렇게하면 배열의 크기를 함수에 명시 적으로 전달해야합니다.

1

C 함수는 배열 참조가 경계에 있는지 여부를 확인하지 않으며 공간 참조를위한 공간을 할당하지 않으므로 차원에 아무런 용도가 없습니다. 포인터 (배열의 시작)로부터의 오프셋만을 계산하고 이미 그것을 어떻게하는지 (int의 크기에 기반하여) 어떻게 알고 있습니다.

두 개 이상의 차원을 지정하는 경우 배열 참조에 대한 적절한 오프셋을 계산할 수 있도록 차원 만 알고 있어야합니다.

3

T a[]T a[N]은 모두 T *a으로 해석됩니다. 즉, 세 사람 모두 a포인터에서 T으로 선언합니다. 이것은 sizeof 또는 단항 & 연산자의 피연산자가 아니면 "N 요소 배열 T"형식의 표현식이 "T 포인터"형식의 표현식으로 변환되고 그 값 배열의 첫 번째 요소의 주소가됩니다.

치수가 무시되는 것은 아닙니다.이 문맥에서는 의미가 없습니다.