2

배열 크기보다 초기화 프로그램이 많은 경우 어떻게되는지 알고 싶습니다. :배열 크기보다 초기화 장치가 더 많을 때의 동작은 무엇입니까?

int t[3] = { 1, 2, 3, 4 }; 

물론 컴파일러는 경고합니다. 정의되지 않은 동작이 예상되지만 C11 표준에서 이에 대한 절을 찾지 못했습니다. 그래서, 나는 무엇인가 놓쳤 느냐?

+0

컴파일러는 무엇입니까? – Kos

+0

이 컴파일러는 무엇입니까? VS2010에서 오류가 발생했습니다. – Mysticial

+0

그것도 컴파일해서는 안됩니다 : http://ideone.com/gWs4i – Nawaz

답변

7

코드가 C와 C++ 모두에서 잘못 구성되었습니다.

C++ 11 §8.5.1 [dcl.init.aggr]/주 6 : 이니셜 - 절의 수가를 초과 할 경우

초기화리스트가 아픈 형성 초기화 할 구성원 또는 요소의 수.

C11

§6.7.9/2 상태 :

없음 이니셜 엔티티가 초기화되고 내에 포함되지 객체에 대한 값을 제공하기 위해 시도 할 수 없다.

0

글쎄 그것은 작성자에 따라 다릅니다. 일부는 심지어 당신이 빌드 못하게, 비주얼 Express를 제공합니다

는 GCC가 날 수 있지만 너무 많은 요소가 경고로
error C2078: too many initializers 

... 나는 생각하지 않는다 예상이 동작은 정의되지 않았으므로이 사례가 주어 지지만 확실하게 작동하지는 않습니다.

예 :

int t[3] = { 1, 2, 3, 4 }; 
int i; 

for(i = 0; i< 5; i++){ 
    printf("val = %d\n", t[i]);} 

val = 1 
val = 2 
val = 3 
val = 4 
val = 134513760 

내가 disasembly에 가지 않았다,하지만 난 그냥 말에 다른 데이터로 실행중인 확신합니다.

+0

i [4]가 이니셜 라이저에서 정의되지 않았다는 것을 잘 고려하면, 나는 놀랍지 않다. 그것이 [3] 적절하게 인쇄한다는 사실은 놀랍습니다. 그러나 그것이 정의되지 않았으므로 기대해서는 안됩니다. – ardent

+0

네, 운이 좋았다고 생각합니다. – Mike

1

예를 들어 생성 된 어셈블러 gcc를 살펴보고 "안전한"경로가 필요한 것처럼 보입니다. 단순히 배열의 크기 과거 값을로드하지 않습니다

void main() { 
    int t[3] = { 1, 2, 3, 4 }; 
} 

는 다음 어셈블리를 생성합니다 :

main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $16, %esp 
    movl $1, -12(%ebp) 
    movl $2, -8(%ebp) 
    movl $3, -4(%ebp) 
    leave 
    ret 

이는 GCC 4.4.3로 생성되었습니다.

+0

컴파일러가 세 가지 요소를 할당하지만 네 개를 저장하려면 "안전하지 않은"것이 아니라 너무 많은 이니셜 라이저를 제공하기 위해 프로그래머를 처벌하는 방식을 벗어나면 안됩니다. –