#include<stdio.h>
#include<stdlib.h>
void main()
{
int *a=(int *)malloc(sizeof(int)*6);
*a=10;
*(a+1)=11;
*(a+2)=12;
*(a+3)=13;
*(a+4)=14;
*(a+5)=15;
*(a+6)=16;
*(a+7)=17;
*(a+8)=18;
printf(\"%d %d %d %d %d %d %d %d\\n\",a,a+1,a+2,a+3,a+4,a+5,a+6,a+7,a+8,a+9);
printf(\"%d\\n\",*a);
printf(\"%d\\n\",*(a+1));
printf(\"%d\\n\",*(a+2));
printf(\"%d\\n\",*(a+3));
printf(\"%d\\n\",*(a+4));
printf(\"%d\\n\",*(a+5));
printf(\"%d\\n\",*(a+6));
printf(\"%d\\n\",*(a+7));
printf(\"%d\\n\",*(a+8));
}
나지금 이게 왜 컴파일 오류, 워닝이 없는지 이해가 안되
동적할당 할때 sizeof(int)*6 했으면 a에 4바이트짜리공간 6개가 (24바이트) 동적할당 되고
주소값은 그렇다고 쳐도 7번째 값 출력부터는 가비지값 뜨는게 정상인걸로 생각되는데
전부다 정상적으로 출력되네
컴파일러가 알아서 그냥 허용해주는거야? 아니면 내가 포인터를 잘못알고있는거야
비쥬얼스튜디오 2010 윈7 64bit 에서 컴파일했음
기본적으로 컴파일러는 out of index에 대해 관여하지 않아요. 그리고 정적이든 동적할당을 했든 실제로는 그 변수만을 위해 할당된 독립적인 공간은 아니라는걸 이해해줬으면 좋겠음. 그냥 주어진 주소를 기준으로 해서 연속적인 메모리 공간에 쓰고 읽을 뿐..
http://gall.dcinside.com/programming/258820
java하던 아희들은 저게 이해가 안되고 구려보일 수 있겠지만 저게 한편으론 테크닉으로 응용되기도 해. 물론 모르고 쓰면 버그양성소
전 Java에 대해서 배운적도없고 오로지 C언어만 했지만.. 인덱스에 관여하지않는다는 말은 알겠는데..
실제로 할당을 받게되면 일단 여유분을 더 만든다는 소리인가요?
근데 저런식으로 하게되면 나중에 프로그램에 상당한 오류를 만들수있는 잠재적 오류가 아닐까 하는데
할당시 여유분은 없다고 생각해야 함. 당연히 잠재적 오류를 내포하고 있지만 그게 C의 장점이자 단점이지요.
할당은 대충 이런식으로 된다고 생각하면 됨.
A : a에다가 50바이트 할당해야겠네. 어이, 50 바이트좀 할당해줘봐.
B : 어.. 100번지가 비었네, 100번지부터 쓰면 됨ㅇㅇ
아 알겠음 ㅋ 키사횽 넘 고마버 ㅋㅋㅋ
A : ㅇㅋ. 어? b에 20바이트 할당해야겠다. 야, 20바이트~
B : ㅇㅇ. 150번지부터 쓰면 됨ㅇㅇ
ㅇㅇ
그래서 a[50]하면 그냥 150번지에 써버리는거임. 그게 a의 영역이든말든
위에말이 잘 이해안되네.. a에다가 50바이트 할당하면 100 부터 150까지 라고잡고
b에 20바이트 할당해야되겠다하면 150-170 까지 할당이 되는거아님? 근데 a[50]하면 150번지에 쓴다는건 뭐지..;;
그러다가 남의 영토 침범하지
100 - 149 까지지..
그게 a의 영역이든말든?.. 점점 미궁으로 빠져든다 ...ㅠ
실제로는 할당된 영역을 저장하는 공간이 추가로 붙긴하지만 저렇다고 생각하면 됨
키사노바횽의 든 예를 이용해 설명하자면 너님이 a[50]의 값을 바꾸면 b[0]의 값을 바꾸는 짓을 해버리게되는거지
C언어는 무식해서 a[70]하면 그냥 a의 기본 주소인 100번지에다가 70을 더해서 거기다가 읽고 쓰고를 함..
아 ㅋㅋㅋㅋㅋ알겠다 a[0]~[49] 까지인데 [50]까지도 할당이 된다는말이구나
아진짜 이해됨 ㄳㄳ ㅋ 와 진짜 한방에 팍왔네 ㅋ
남의 영토가 다행히도 안 쓰이고 있는 부분이라면 별 문제 없지만, 프로그램 작동에 중요한 역할을 하는 변수들이 들어있는 부분이라면........ 프로그램은 시ㅋ망ㅋ 하겠지
할당이 된다는게 아님. 접근을 맘대로 할수있다는 얘기이지.
아 적분횽 이해했어. 할당이아니고 접근 ㅋ 할당은 [49]까지 정확하게 할당이된거고
접근은 그외에도 a[]통해서 다른영토까지
침범이 가능하단소리네
굳
심지어는 *(0x80000000) = 1 이런식으로 아무 주소의 값이나 바꾸는 일도 가능. (요즘 컴파일러는 이 짓은 막더라.)
저거 컴파일러가 막는게 아니라 형변환이 안되는거 아닌가. *((int*)0x80000000) = 1; 이러면 걍 컴파일 해버릴 것 같은데
힙 헤더 깨먹었네 디버깅 하려면 힘들겠다.