C 문자열 (배열 char
)과 다른 배열 사이에는 혼란 스럽다고 생각됩니다. C 문자열은 null 문자 ('\0'
)로 끝나지만 모든 배열 (심지어 char
배열)이이 방법으로 종료되지 않는 규칙입니다.
일반적으로 배열의 길이를 어딘가에 저장하거나 배열 끝에 센티널 값을 사용하는 것이 일반적입니다. 이 값은 배열 내부에 나오지 않는 값이어야합니다. 예를 들어, 문자열에 '\0'
또는 양의 정수 배열에 -1
이 있어야합니다.
size_t length = sizeof(a)/sizeof(a[0]);
그래서 당신은 할 수 :
int a[] = {1,2,3,4,5,6,7,8};
size_t length = sizeof(a)/sizeof(a[0]);
// In this case, sizeof(a[0])
// is the same as sizeof(int), because it's an int array.
당신이 a
이 int 배열 (그리고있는 int 배열이 아닌 포인터), 당신이 사용할 수있는 것을 알고있는 경우 또한
, 그러나 당신은 할 수 없습니다 :
int *a = malloc(sizeof(int) * 10);
size_t length = sizeof(a)/sizeof(a[0]); // WRONG!
마지막 예제는 컴파일되지만 대답은 잘못 될 것입니다. 배열의 크기보다는 배열에 대한 포인터의 크기를 얻습니다.
이 sizeof
을 사용하여 함수에 전달 된 배열의 크기를 읽을 수도 없습니다. 컴파일러가 함수 인수의 배열을 첫 번째 요소의 포인터로 변환하기 때문에 함수 len(int *a)
또는 len(int a[])
- a
이 포인터가 될지 여부는 중요하지 않습니다.
예 - 당신이하려는 것은 본질적으로 결함이 있습니다. C에서 배열 길이를 셀 수는 없습니다. 실제 배열이 있다면'#define ARRLEN (arr) (sizeof (arr)/sizeof (* arr))'을 사용할 수 있지만 포인터에는 사용할 수 없습니다. 따라서 함수에 전달 된 배열에서. –