작성
·
226
1
int main()
{
char* buffer=NULL;
fgets(buffer, 10, stdin);
printf("%s", buffer);
return 0;
}
int main()
{
char buffer[10];
fgets(buffer, 10, stdin);
printf("%s", buffer);
return 0;
}
밑에 코드는 출력까지 문제 없이 되는데
위에 코드는 출력이 되지 않습니다.
왜 이런 현상이 발생하는지 알고 싶습니다.
답변 1
1
안녕하세요, 답변 도우미 Soobak 입니다.
첫 번째 코드에서는 buffer
포인터가 유효한 메모리 영역을 가리키지 않기 때문입니다.
두 번째 코드에서는 buffer
배열이 유효한 메모리 영역을 차지하기 때문에 문제가 없습니다.
int main()
{
char* buffer = NULL;
fgets(buffer, 10, stdin);
printf("%s", buffer);
return 0;
}
: 포인터 변수 buffer
의 초기값으로 NULL
이 할당되어있어, fgets()
함수를 호출할 때 buffer
변수가 유효한 메모리 영역을 가리키고 있지 않습니다. 즉, fgets()
함수는 NULL
주소에 문자열을 기록하려고 시도하게 되므로, segemtation falut
혹은 다른 메모리 관련 오류가 발생하는 것입니다.
int main()
{
char buffer[10];
fgets(buffer, 10, stdin);
printf("%s", buffer);
return 0;
}
: 이 코드에서는 크기 10
의 char
자료형 buffer
배열이 스택
메모리 영역에 할당되므로, fgets()
함수로 유효한 메모리 영역에 데이터를 저장할 수 있습니다.
안녕하세요, 답변 도우미 Soobak 입니다.
fgets()
함수를 사용하실 때 포인터 변수를 사용하시려면, 초기화 뿐만 아니라 메모리를 동적으로 할당한 후 사용하셔야 합니다.
관련 내용은 강의 12.13 메모리 동적 할당 에서 학습하시게 됩니다.
예시 코드를 첨부드립니다. 👍
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *buffer = (char *)malloc(10 * sizeof(char));
if (buffer == NULL) {
fprintf(stderr, "메모리 할당 실패!\n");
return 1; // Return with error code
}
fgets(buffer, 10, stdin);
printf("%s", buffer);
free(buffer); // 메모리 해제 !!
return 0;
}
포인터 변수는 그 자체로 메모리를 가지고 있지 못하기 때문에 저장할 공간이 없어서 데이터를 못받으니 메모리 동적할당으로 포인터변수에 메모리를 준 다음에 받아야한다라고 이해했는데, 혹시 잘못 이해한 부분이 있을까요?
안녕하세요, 답변 도우미 Soobak 입니다.
잘 이해하고 계십니다!
포인터 변수는 메모리 주소를 저장하기 위한 변수입니다.
즉, 그 자체로는 메모리 공간을 "가진다" 는 것이 아니라, 다른 메모리 공간의 주소를 가리키는 역할을 합니다.
따라서, malloc()
혹은 calloc()
등의 함수를 사용하여 메모리를 동적으로 할당하고, 그 주소를 포인터 변수에 저장하여 특정 메모리 영역을 가리키게 하거나, 기존의 변수나 배열의 주소를 포인터 변수에 저장하여 가리키도록 하셔야 합니다.
그럼 포인터 변수를 이용해서 fgets함수로 문자열을 받고싶을경우에는
포인터변수를 어떤 방식으로 초기화하면 되는건가요?