동적메모리 할당에 대한 질문입니다.
초코맛사탕
질문 제목 : 동적메모리 할당에 대한 질문요.
질문 내용 :
열혈강의에 있는 내용입니다.
사용자로부터 정수를 입력받고 그 크기만큼의 배열을 생성하는건데요..
#includestdio.h
void make(int);
int main(void)
{
int number;
fputs(배열의 크기를 입력하세요. : , stdout);
scanf(%d, &number);
make(number);
return 0;
}
void make(int number)
{
int* arr = (int*)(malloc(sizeof(int)*number));
int i ;
if(arr==NULL)
{
fputs(메모리 할당 실패! \n, stdout);
return 1;
}
for(i=0; inumber; i++)
{
arr[i] = i+1;
printf(%d , arr[i]);
}
}
위의 make함수내에서 int* arr = (int*)(malloc(sizeof(int)*number));이 부분이요..
만약입력된 number가 10이라고 가정하고.. 그럼 int형이 4바이트니까.. 총 40바이트의 메모리공간이 생성된거죠?
malloc 함수의 리턴형이 void* 니까.. 이걸 인트형 포인터로 형변환하고 있고 이를 다시 인트형 포인터 arr에 저장하고 있는데요.
음.. 그럼 arr은 int형 포인터니까.. 이를 int형 배열처럼 사용이 가능한데.. 그렇다면 이 arr 배열의 총 길이가 얼마가 되는건가요?
배열 요소 하나하나가 4바이트니까 전체 40바이트를 4로 나누어 총 길이가 10이되는건가 싶었는데.. 여기 나와잇는 예제도 그런 의미 같구요..
그런데.. for문을 이렇게 바꾸어도 출력이 되더군요.
for(i=0; isizeof(int)*number; i++)
{
arr[i] = i+1;
printf(%d , arr[i]);
}
이렇게 하면 0에서 40까지의 숫자가 출력이 됩니다.. 그럼 배열의 길이가 40이 되는건가?? 뭐 이상해서..
젤 뒤에 arr[100] = 1; 을 주고 이를 출력해봤떠니.. 이거역시 출력이 되더군요..
도대체 이걸 어떻게 이해해야 하는 건가요 ;;
원래의 목적은.. 입력한 수 만큼의 배열길이는 지정하는 겁니다.
-
CutieBaby
답변 감사합니다 ^^
덕분에 많이 배우네요~~ -
주미
일반적으로 그렇습니다. 아닐수도 있고요.
복불복입니다.
운영체제가 선점하고 있었다거나 하면 100% 세그먼트폴트, 엑세스바이올레이션이 발생합니다.
이런 이유로 msvc의 경우 약이될수도, 독이될수도 있는 선택이긴 합니다만 언젠가부터 범퍼가 되어줄 메모리 공간을 사용자가 사용할 메모리 앞/뒤에 조금씩 삽입하는 형태로 메모리를 관리하는 걸로 알고 있습니다.
그리고 메모리의 끝을 알수 없기 때문에 문자열도 마찬가지로 맨 마지막이 null문자가 아닌 문자 -
놓아주세요
배열의 끝은 알수가 없는거였군요...
그렇다면 만약 arr이 크기가 10인 배열이고.. 다른 작업으로 배열이 저장되있는 메모리 바로 다음 공간에 어떠한 내용이 저장이 되있다면..
그 이후에 arr[11] = 1; 이라는 식으로 값을 변경해버리면 프로그램 실행중에 오류가 발생한다는 뜻인가요? -
치에미
할당받는 메모리의 크기가 int*number 만큼이고 int*로 케스팅해서 int*에 물려놧으니
number가 10이면 40바이트를 할당해서 arr에 물려놧을 것이고,
정적배열로 표현하면 arr[10] 에 해당하는 크기를 가질 것입니다.
(malloc이 void*를 반환하고 이것을 케스팅해서 써야 하는 이유는... 제가 아는 한도에선 malloc과 같은 메모리를 핸들링하는 함수들은 내부에선 메모리 덩어리를 char단위로 취급하기 때문입니다. 내부에선 바