는 C

2017-10-04 15 views
1
여기

복합 리터럴 포인터를 초기화 한 포인터를 초기화 그리 일반적인 방법이다.는 C

#include <stdio.h> 
int main(void) 
{ 
    int *p = (int[10]){[1]=1}; 
    printf("%d\n", p[1]); 
} 

출력 :

1 

이 프로그램은 컴파일 및 G에서 잘 실행 ++ 컴파일러.

그래서,

  • 는 복합 리터럴에 대한 포인터를 초기화하는 올바른 방법인가

    ? 또는

  • 정의되지 않은 동작 복합 리터럴에 대한 포인터를 초기화합니까?

+0

'int p [10];'과'p [1] = 1'을 설정 한 후 (깨끗하게 코딩하는 경우) – YaatSuka

+0

"익명의 배열 요소" 화합물 리터럴 (compound literal) "이 발생합니다. 그렇지 않으면 : 포인터로 변환하지 않고 복합 리터럴 *을 사용하는 * 방법이 있습니까? 유일한 질문은 복합 문자의 수명입니다. –

+0

"포인터를 초기화하는 올바른 방법입니까?" 당신이하고 싶은 것에 달려 있습니다. 코드는'int arr [10] = {[1] = 1}과 100 % 동일합니다. int * p = arr;'. 로컬 범위를 가진 배열을 원한다면 어느 것이 든 완벽하게 괜찮습니다. – Lundin

답변

2

예, 복합 리터럴에 대한 포인터가 있어야 유효합니다. 표준은 이것을 허용합니다.

n1570-§6.5.2.5 (P8) :

예 1 두 int 배열의 첫 번째 요소는 제를 가리 키도록

int *p = (int []){2, 4}; 

p 초기화 파일 범위 정의 두 번째 값과 두 번째 값, 네 값을가집니다. 이 화합물 리터럴의 표현식은 일정해야합니다. 익명 개체 의 정적 저장 기간은입니다.

+0

이 예제는 파일 범위 용이지만이 이니셜 라이저는 함수 범위에 있으므로 상수 값을 가질 필요가 없습니다. –

+0

@AnttiHaapala; 동의했다. C 표준에 언급 된 데모입니다. – haccks