2011-09-19 3 views
-1

문자열 리터럴로 초기화 된 배열을 취하는 int foo(char str[]);조차도 작동하지 않습니다. 나는 strlen과 같은 것을하도록 요청 받았고, 내가 취하고 자하는 접근법은 전체 문자열에 sizeof를 사용하고 그다지 흔하지 않은 토큰에 따라 적절히 뺍니다. 단순히 모든 것을 세는 것보다 일부 작업을 중단합니다.sizeof 인수에

그래서 참으로 배열 (포인터도 시도했지만)에서 역 참조 연산자를 사용하여 시도했지만 결국 첫 번째 배열 요소 만 가져옵니다.

어떻게 인자를 전달할 수 있습니까? 나는 값으로 전달하는 것이 효과가있을 것이라고 생각하지만 실제로 문자열을 사용할 수 있는지 여부는 알 수 없습니다.

+2

[질문 [comp.lang.c faq] (http://c-faq.com/)의 7.28을 읽으십시오. 이미 나와 있기 때문에 전체 섹션을 읽으십시오 ... 전체 FAQ :-) – pmg

+0

[C 크기의 전달 된 배열] (0120) (이) 나 –

답변

2

int foo(char str[]); 리터럴 문자열로 초기화 된 배열에 걸릴 것

그것은 그것이하는 것이 아닙니다. 여기서 char str[]char* str과 동일합니다. 배열 유형이 매개 변수의 유형으로 사용되면 해당 유형의 포인터로 변환됩니다.

함수에서 pointed-to 배열의 크기가 필요하면 다른 매개 변수를 사용하여 직접 크기를 전달하거나 함수에서 직접 계산해야합니다 (예 : , C 문자열이있는 시나리오에서는 문자열의 끝을 쉽게 찾을 수 있습니다.

+0

>> 매개 변수의 형식으로 배열 형식이 사용되면 변환됩니다. << 컴파일러/디버거 등에서는 여전히 배열 타입과 포인터 타입이라고 불린다. 또한 배열을 계산하면 내 목적을 달성 할 수 없지만 최후의 수단으로이를 수행 할 수 있다고 가정합니다. 나는 가능한 한 적은 작업을 목표로 삼았다. – lightburst

+0

"컴파일러/디버거 등에서 배열 유형 및 포인터 유형이라고 부릅니다."오류 메시지 및 사용자 지향 출력에있을 수 있습니다.내부적으로'char []'와'char *'타입의 매개 변수는 똑같습니다. 그 (것)들 사이 아무 차이도 없다. 서로 바꾸어 사용할 수 있습니다. –

0

C 문자열은 단지 char의 배열입니다. 배열은 C에서 값으로 전달되지 않습니다. 대신 첫 번째 요소에 대한 포인터가 전달됩니다.

그래서이 둘은 동일합니다

void foo(char blah[]) { ... } 
void foo(char *blah) { ... } 

이 두가 동일 :

char str[] = "Hello"; 
foo(str); 

char *p = str; 
foo(p); 
1

sizeof은 사용할 수 없습니다. C 배열에서 은 함수에 전달 될 때 포인터에 대해이 소멸되어 있으므로 은 플랫폼에 따라 4 또는 8 크기의 포인터를 제공합니다. 제안 된대로 strlen(3)을 사용하거나 명시 적 두 번째 인수로 배열의 크기를 전달하십시오.

+0

+1은 배열 크기를 명시 적 인수로 전달할 것을 제안합니다. – AAT

0

배열을 함수 매개 변수로 전달할 수 없으므로 함수 내에서 sizeof 트릭을 사용할 수 없습니다. 배열 표현식은 함수 호출을 포함하여 대부분의 컨텍스트에서 포인터 값으로 암시 적으로 변환됩니다. 함수 매개 변수 선언의 문맥에서 T a[]T a[N]T *과 동의어입니다.

배열 크기를 별도의 매개 변수로 전달해야합니다.

+0

ARBITRARY 길이 배열을 공식으로 전달할 수 없습니다. struct {};에 랩핑하면 고정 길이 배열을 전달할 수 있습니다. 하지만 일반적으로 바보입니다. 런타임에 크기를 결정할 때 문제가 발생하면 크기를 전달하거나 구조체 { } 크기와 포인트를 멤버로 사용하십시오. –