배열 크기보다 초기화 프로그램이 많은 경우 어떻게되는지 알고 싶습니다. :배열 크기보다 초기화 장치가 더 많을 때의 동작은 무엇입니까?
int t[3] = { 1, 2, 3, 4 };
물론 컴파일러는 경고합니다. 정의되지 않은 동작이 예상되지만 C11 표준에서 이에 대한 절을 찾지 못했습니다. 그래서, 나는 무엇인가 놓쳤 느냐?
배열 크기보다 초기화 프로그램이 많은 경우 어떻게되는지 알고 싶습니다. :배열 크기보다 초기화 장치가 더 많을 때의 동작은 무엇입니까?
int t[3] = { 1, 2, 3, 4 };
물론 컴파일러는 경고합니다. 정의되지 않은 동작이 예상되지만 C11 표준에서 이에 대한 절을 찾지 못했습니다. 그래서, 나는 무엇인가 놓쳤 느냐?
코드가 C와 C++ 모두에서 잘못 구성되었습니다.
C++ 11 §8.5.1 [dcl.init.aggr]/주 6 : 이니셜 - 절의 수가를 초과 할 경우
초기화리스트가 아픈 형성 초기화 할 구성원 또는 요소의 수.
C11
§6.7.9/2 상태 :없음 이니셜 엔티티가 초기화되고 내에 포함되지 객체에 대한 값을 제공하기 위해 시도 할 수 없다.
글쎄 그것은 작성자에 따라 다릅니다. 일부는 심지어 당신이 빌드 못하게, 비주얼 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에 가지 않았다,하지만 난 그냥 말에 다른 데이터로 실행중인 확신합니다.
예를 들어 생성 된 어셈블러 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로 생성되었습니다.
컴파일러가 세 가지 요소를 할당하지만 네 개를 저장하려면 "안전하지 않은"것이 아니라 너무 많은 이니셜 라이저를 제공하기 위해 프로그래머를 처벌하는 방식을 벗어나면 안됩니다. –
컴파일러는 무엇입니까? – Kos
이 컴파일러는 무엇입니까? VS2010에서 오류가 발생했습니다. – Mysticial
그것도 컴파일해서는 안됩니다 : http://ideone.com/gWs4i – Nawaz