함수 인자에서 이중 포인터 문제

mips의 이미지

void func(char** str) 
{ 
        int i; 
        for ( i = 0 ; i < 9 ; i++ ) 
                printf("%s\n", str[i]); 
} 
 
int main(void) 
{ 
        int i, j; 
        char str[10][10] = { "abc", "abc", "def", "asdfa", "badf", "badf", "badf", "badf"}; 
 
        func(str); 
        return 1; 
} 

대충 위와 같은 코드가 있을 때, 컴파일을 하면, 타입이 맞지 않다고 워닝이 뜹니다. (실행했을 때는 segmentation fault가 납니다.)
char *str[10]; 으로 선언했을 때는 잘 되는데 배열값을 고정시키면 왜 안 될까요?

char **str 과 char str[10][10]이 어떻게 다른 거죠?

irondog의 이미지

배열 str[0] str[1]의 주소값과 포인터 str, (str+1) 주소값이 어떻게 다른지 보시면 차이를 알 수 있을 것 같습니다.

아마도 전자는 10 + padding byte 정도의 주소값 차이가 날 것이고 후자는 포인터 사이즈인 4바이트 차이가 있겠죠. 그러니 오류가 날 수 밖에 없습니다.

어차피 main()에 포함된 지역변수라면 전역변수나 static한 전역 변수로 바꿔도 무방할 것 같네요.