2010-02-09 7 views
3

있는 단일 차원 포인터 배열을 주소 I 다음 숙제 질문이 : 내가 GCC으로 코드를 컴파일 시도두 가지 차원

Consider the following declarations and answer the question. 
char strarr1[10][32]; 
char *strarr2[10]; 

Are strarr1[3][4] and strarr2[3][4] both legal references? 

그것을 테스트 할 수 있습니다. 나는 두 번째 참조가 오류를 던질 것이라고 확신했지만 실제로는 그렇지 않았다. 이것은 gcc로 컴파일 한 것입니다.

int main(void){ 
    char strarr1[10][32]; 
    char *strarr2[10]; 

    char x = strarr1[3][4]; 
    char y = strarr2[3][4]; 

    return 0; 
} 

제가 사용하는 테스트 코드가 정확하다는 가정하에 작업하고 있습니다.

strarr2가 1 차원 배열 일 때 strarr2 [3] [4]를 어떻게 참조 할 수 있습니까?

답변

1

는 숯 *의 배열은, 상기 제 [4]은에 대한 인덱스이고 문자 *는이

char * temp = strarr2[3]; 
char y = temp[4]; 

과 같은 일을 의미

나는 '돈 때문에 어디에서든지 strarr2가 초기화되는 코드를 볼 수 없으며 strarr2 [3]가 할당되는 곳을 볼 수 없으며이 코드는 제시된대로 작동하지 않습니다. 그것은 쓰레기 또는 segfault를 반환합니다.

0

포인터의 단일 차원 배열입니다. 오프셋 그래서, = 4 3에 포인터를 인덱싱된다로서

char y = *(strarr2[3] + 4); 

은 동일하다 : strarr2 보낸

char y = strarr2[3][4]; 
1

이들은 모두 포인터 연산 색인 규칙 때문에 유효한 구문입니다. 그러나 코드에서 :

char y = strarr2[3][4]; // <--- NOT SAFE! 

는 할당되지 않은 메모리를 액세스하고 정의되지 않은 동작을 생성, 그것은 나쁜입니다 ERGO된다.

그래서 종료하십시오.