#include <stdio.h>
#include <stdlib.h>
void print2Darr(int _arr[][5], int columnsize)
{
int column, row;
for(column = 0; column < columnsize; column++)
{
for(row = 0; row < 5; row++)
printf("|=", _arr[column][row]);
printf("\n");
}
}
int main()
{
int arr[5][5] = { ... };
print2Darr(arr[5][5], 5);
}
일단 읽자마자 화가 치밀어 오르는 엉터리 소스 보게해서 죄송하빈다
아는애가 과제하는데 오류 뜬답시고 던져준 소스인데
저 소스대로 컴파일 하면 에러가 안뜨고 그냥 실행되는 이유가 뭔가요?
원래대로면 배열 인덱스 범위 벗어나서 바로 작동중지 떠야되는거가 아닌가요?
또 배열의 크기를 다르게 설정하면 작동 중지 뜨던데
왜 크기에 따라서 오류 여부가 갈리는지 같이 말해주시면 감사..
뭔소리야 인덱스 안넘어가는구만
컴파일 오류나서 컴파일도 안되는데 그리고 배열로 줄거면 arr[5][5] 이걸 주지 말고 arr를 줘야지
저게 컴파일이된다고?
매개변수로 배열을 저렇게넘기는데 빨간줄뜨잖아
그리고 배열인덱스범위 벗어난다는건 어디뭐얘기하는거? 대충보니까 5x5사이즈 2차원배열받아서 행렬갯수 5x5에맞춰서 출력하고 안벗어나는데? 출력결과도 25개 출력되잖아
컴파일러마다 되는데도 있고 아닌데도 있음~
에엒따
[][5] 라는건 column 이 5 고 row 는 정해지지 않은 2차원 배열이란 뜻이지 [0][5] 란 뜻이 아님유.
이미 main 함수에서 row 5까지는 할당이 되어 있는 경우라 문제 없이 출력되는 것.
저 소스코드의 row 는 사실 column 인데 이상하게 적어뒀네 ㅋㅋ
보통 배열의 경계를 넘는다고 해서 반드시 오류가 뜨진 않아.
int arr[5][5]로 만들어서 넘겼으니 이케이스에선 배열인덱스 안벗어나지않아요?
C 언어는 배열의 경계 밖으로의 접근을 기본적으로 허용해. 배열 레벨에서 메모리 프로텍션을 하진 않거든.
응 위에 적었잖아. row 5 까지 할당되어 있어서 문제 없다구.
역시 컴파일러는 무서운세상이야.. ideone에서 gcc로 확인해보자하고했는데 똑같이안되는데 또 이게 되는 컴파일러가 있나보구나..
만약 debug 모드면 변수와 변수사이 메모리 간격도 좀 더 느슨해져서 오류가 안나다가 release 에서 타이트해져서 오류가 나는 경우도 있고, 기본적으로 memory alignment 라고 해서 1바이트 단위로 촘촘히 할당되는게 아니라, 4바이트 8바이트 16바이트 간격으로 셋팅되어 변수와 변수 사이가 띄엄띄엄 할당된 경우들에도 조금삐져나온건 문제가 되지 않기도 해.
아아 C는 메모리 프로텍션을 안하구나
메모리 프로텍션을 하지 않아서 삐져 나갔을때 다른 변수나 복귀주소를 덮어 써버리면 오류가 나는거지 뭐.