char a[255];
void test(char* a){
printf("%d %d %d \n",sizeof(a),sizeof(*a),sizeof(&a));
}
이들 모두는 변수 'a'의 실제 크기를 얻지 못합니다.함수 (언어 c)에서 char 배열 크기를 얻으려면 어떻게해야합니까?
char a[255];
void test(char* a){
printf("%d %d %d \n",sizeof(a),sizeof(*a),sizeof(&a));
}
이들 모두는 변수 'a'의 실제 크기를 얻지 못합니다.함수 (언어 c)에서 char 배열 크기를 얻으려면 어떻게해야합니까?
수 없습니다. 크기를 추가 매개 변수로 전달해야합니다. 아마도 크기가 음수 일 수 없기 때문에 아마도 unsigned int
유형 일 것입니다. 이 같은 최종 결과는 비록 그 대회이기 때문에
void test(char* a, unsigned int size)
{
// ...
}
, 두 번째 인수 size_t를 만들기 위해 더 나은 것입니다.
void test(char* a, size_t size)
{
// ...
}
첫 번째 요소에 대한 포인터와 함께 명시 적으로 전달해야합니다.
char a[255];
void test(char* a, size_t num_elem){
/* do smth */
}
int main() {
test(a, sizeof a/sizeof a[0]);
return 0;
}
그리고 sizeof a/sizeof a[0]
당신에게 배열 내 요소의 수를 제공,이 트릭 포인터 만 배열 제대로 작동하지 않습니다.
'sizeof a [size] a [0]'트릭은'main' 함수에서만 작동합니다. 'a'는 배열 타입이고'test'에서는 작동하지 않습니다. 왜냐하면' a'는 포인터 타입의 매개 변수 'a'에 의해 음영 처리됩니다. – majk
예, 그 트릭은 포인터가 아니라 배열에만 적용되어야합니다. – Sergio
더 중요한 것은 두 위치 모두 "작동"하지만 한 번 매개 변수의 경우와 같이 포인터 유형 (pointer-to-type)으로 변환되면 확실히 원하는대로 작동하지 않습니다. 이 경우에는 많은 경우에 오류가 발생하거나 경고없이 컴파일 될 수 있기 때문에 많은 엔지니어의 단점이되었습니다. – WhozCraig
당신은 그렇게 할 수 없습니다. a
은 char*
유형이며 관련 크기가 없습니다. 이것이 버퍼에 출력하는 대부분의 표준 라이브러리 메소드가 버퍼 크기를 지정하는 추가 매개 변수를 갖는 이유입니다 (strncpy 참조).
다른 함수로 전달할 때 배열에 포인터가 없어 질 수 없습니다. 선언의 범위 내에서만 크기를 얻을 수 있습니다 (전역 배열의 경우 함수 범위, 전역 배열의 경우 파일 범위). –
strlen (a); 문자열의 크기를 반환하지만 전체 배열은 반환하지 않습니다. –
[sizeof '(배열을 가리키는 포인터)를 찾는 방법] (http://stackoverflow.com/questions/492384/how-to-find)을 참조하십시오. - sizeofa-pointer-pointing-to-an-array). – Lundin