문제

배열이 포인터로 부패하는 경우의 경우 다음 규칙에 대한 규칙에서 :

표현식에 나타나는 유형 배열의 lValue [질문 2.5 참조]는 첫 번째 요소에 대한 포인터로 표현 된 (세 가지 예외가 있음); 결과 포인터의 유형은 포인터 투 -T입니다.

(예외는 배열이 크기 또는 연산자의 피연산자 일 때 또는 문자 배열의 문자열 이니셜 라이저 일 때입니다.)

배열이 "문자 배열의 문자열 이니셜 라이저"인 경우 사례를 이해하는 방법은 무엇입니까? 몇 가지 예를 들어주세요.

감사!

도움이 되었습니까?

해결책

배열이 포인터로 부패하지 않는 세 가지 예외는 다음과 같습니다.

예외 1. - 배열이 오페라 인 경우 sizeof.

int main()
{
   int a[10];
   printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */

   int* p = a;
   printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}

예외 2. - 배열이 오페라 인 경우 & 운영자.

int main()
{
    int a[10];
    printf("%p", (void*)(&a)); /* prints the array's address */

    int* p = a;
    printf("%p", (void*)(&p)); /*prints the pointer's address */
}

예외 3. - 배열이 문자 그대로 문자열로 초기화 될 때.

int main()
{
    char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */

    char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}

다른 팁

선언을 가정합니다

char foo[] = "This is a test";
char *bar  = "This is a test";

두 경우 모두 문자열 문자의 유형 "This is a test대부분의 상황에서 배열 표현식은 "n- 요소 배열의 t"에서 "포인터 to t"로 암시 적으로 변환되며, 표현식은 배열. 선언에서 bar, 그것이 바로 일어나는 일입니다.

선언에서 foo, 그러나 표현식은 다른 배열을 초기화하는 데 사용되므로 ~ 아니다 포인터 유형으로 변환; 대신, 내용물 문자열 문자의 문자열이 복사됩니다 foo.

이것은 문자 배열의 문자열 이니셜 라이저입니다.

char arr[] = "literal string initializer";

또한

char* str = "literal string initializer";

K & R2의 정의 :

문자열 상수라고도하는 문자열 문자는 "..."에서와 같이 이중 인용문으로 둘러싸인 일련의 문자입니다. 문자열에는``array of character ''와 스토리지 클래스 정적 (아래 par.a.3 참조)이 있으며 주어진 문자로 초기화됩니다. 동일한 문자열 리터럴이 구별되는지 여부는 구현 정의이며 문자열 문자를 변경하려는 프로그램의 동작은 정의되지 않습니다.

Comp.Lang.c FAQ (기존 버전 또는 인쇄 된 버전 일 수도 있고 온라인 상태의 현재 상태와 일치하지 않음)에서 그 인용문을 가져온 것 같습니다.

http://c-faq.com/aryptr/aryptrequiv.html

해당 섹션은 FAQ의 다른 섹션과 연결되어 이러한 예외를 자세히 설명합니다. 귀하의 경우, 당신은 다음을 살펴 봐야합니다.

http://c-faq.com/decl/strlitinit.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top