해결된 질문
작성
·
143
0
안녕하십니까? 강사님!
초보자의 문득 드는 생각으로 질문드립니다.
"섹션4 자료 자체와 정렬된 인덱스 분리" 강의의 MakeIndexAge함수 내용중에
USERDATA** aList;
aList = malloc(sizeof(USERDATA*) * GetListCount());
memset(aList, 0, sizeof(USERDATA*) * GetListCount());
위의 코드를 그냥 이렇게 작성하면 안될까요?
USERDATA** aList[GetListCount()]={0};
잘몰라서 드리는 질문입니다.
이해해 주시길 바랍니다
수고하십시오
답변 2
0
배열의 크기는 코드가 작성되는 시점 (컴파일 타임)에 이미 결정되어야 합니다. 그런데 문제는 프로그램이 작동하는 과정에서 인덱스의 크기는 달라질 수 있다는 점 입니다. 이 때문에 동적 할당하는 것입니다. 애석하게도
USERDATA** aList[GetListCount()]={0};
제안하신 형식은 C언어 문법에서 허용되지 않습니다.
다만, 이런 생각은 매우 바람직한 아이디어 이며 프로그래밍 언어 및 컴퓨터 구조를 이해하는 것에 있어 매우 도움되는 질문이라 할 수 있습니다. 참고하시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
ssmjung님의 질문은 섹션 4에서 소개된 MakeIndexAge
함수의 특정 코드 구현 방식에 대한 것입니다. 질문하신 코드의 핵심은 동적 할당 대신 자동 할당(스택 할당)을 사용하여 USERDATA**
타입의 배열을 초기화하는 것에 관한 것입니다.
이와 비슷한 질문에 대한 답변을 찾아본 결과, 직접적으로 같은 질문을 다룬 자료는 없으나, USERDATA**
반환형과 관련하여 강의에서 질문된 내용을 찾았습니다. 질문 “자료 자체와 정렬된 인덱스 분리 강의에서 질문”에 대한 답변에서 MakeIndexAge
함수의 존재 이유 및 구현 방식에 대한 일반적인 설명이 포함되어 있을 수 있습니다. 그러나 특정한 코드 구현 방식(즉, 배열을 스택에 할당하는 방식)에 대한 직접적인 답변은 아닙니다.
주어진 코드 조각 USERDATA** aList[GetListCount()] = {0};
에 대해 말씀드리면, C언어에서는 변수 크기로 배열의 크기를 지정하는 가변 길이 배열(VLA)을 사용할 수 있지만, 이는 C99 표준에서 도입된 것으로 특정 컴파일러나 모드에서만 지원됩니다. 또한 이 방식은 배열을 스택에 할당하게 되므로, 큰 크기의 데이터를 다룰 경우 스택 오버플로우를 유발할 수 있습니다.
대조적으로 malloc
을 사용하는 동적 할당 방식은 힙에 메모리를 할당하여 이러한 제한을 피할 수 있으며, 할당된 메모리의 크기를 런타임에 결정할 수 있다는 장점이 있습니다. 따라서, USERDATA** aList = malloc(sizeof(USERDATA*) * GetListCount());
와 같은 코드는 메모리 할당의 유연성과 안정성 측면에서 선호됩니다.
직접적으로 ssmjung님의 질문에 대답하는 자료를 찾지 못했으므로, 여러분의 이해도를 높이고 동적 할당과 스택 할당의 차이점에 대해 배울 수 있는 기회로 삼으시길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.