programing

문자 배열의 리터럴 문자열 이니셜라이저

css3 2023. 9. 17. 13:25

문자 배열의 리터럴 문자열 이니셜라이저

배열이 포인터로 손상되는 경우에 대한 다음 규칙에서:

식에 나타나는 유형 array-of-T의 l 값 [질문 2.5 참조]은 첫 번째 요소에 대한 포인터(세 가지 예외 포함)로 감쇠합니다. 결과 포인터의 유형은 포인터-to-T입니다.

(예외는 배열이 or & 연산자 크기의 피연산자이거나 문자 배열의 문자 문자열 이니셜라이저인 경우입니다.)

배열이 "문자 배열을 위한 문자 문자열 이니셜라이저"일 때 경우를 어떻게 이해합니까?몇 가지 예를 들어 주세요.

감사합니다!

배열이 포인터로 붕괴되지 않는 세 가지 예외는 다음과 같습니다.

예외 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" "15개의 촤 배열"입니다.대부분의 상황에서 배열 표현식은 "T의 N-요소 배열" 유형에서 "T로 포인터"로 암묵적으로 변환되며, 표현식은 배열의 첫 번째 요소의 주소로 평가됩니다.에 대한 선언문에서bar, 바로 그런 일이 벌어집니다.

에 대한 선언문에서foo, 그러나 이 식을 사용하여 다른 배열의 내용을 초기화하고 있으므로 포인터 유형으로 변환되지 않습니다. 대신 문자열 리터럴의 내용이 다음으로 복사됩니다.foo.

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

char arr[] = "literal string initializer";

다음이 될 수도 있습니다.

char* str = "literal string initializer";

K&R2의 정의:

문자열 상수라고도 하는 문자열 리터럴은 "..."에서와 같이 큰 따옴표로 둘러싸인 문자 시퀀스입니다. 문자열에는 "문자 배열" 유형과 저장 클래스 정적이 있습니다(파 참조).A.3). 그리고 주어진 문자로 초기화됩니다.동일한 문자열 리터럴이 구별되는지 여부는 구현 정의되며, 문자열 리터럴을 변경하려는 프로그램의 동작은 정의되지 않습니다.

comp.lang.c FAQ에서 이 인용문을 가져온 것 같습니다(이전 버전이거나 인쇄 버전이거나 온라인 버전과 일치하지 않습니다).

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

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

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

언급URL : https://stackoverflow.com/questions/2036096/literal-string-initializer-for-a-character-array