#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *helloLiteral()
{
char *s1 = "Hello, world!";
return s1;
}
char *helloDynamicMemory()
{
char *s1 = malloc(sizeof(char) * 20);
strcpy(s1, "Hello, world!");
return s1;
}
int main()
{
char *s1;
char *s2;
s1 = helloLiteral();
s2 = helloDynamicMemory();
printf("%s\n", s1);
printf("%s\n", s2);
free(s2);
//free(s1);
return 0;
}
이 코드에서 포인터 s2의 동적메모리 해제할 때
s2만 해제하는 이유가 궁금합니다.
<C 언어 코딩 도장>은 중간부터 학습할 수 있게 설계되어 있지 않습니다. UNIT 1부터 순서대로 공부할 것을 전제로 설계되어 있습니다. 레퍼런스 서적이 아니므로 중간만 봐서는 이해할 수 없는 부분이 반드시 있습니다. 레퍼런스 서적은 이미 지식이 있는 사람이 찾아보는 책이고, 입문서는 지식이 없는 사람이 순서대로 학습하며 체계적인 지식을 쌓게 하는 데 목적이 있습니다.
회원님의 전체 학습을 검토한 결과 차례대로 학습한 경험이 없는 것으로 확인됩니다. 예제도 책에 없으며 UNIT 61은 질문과 관련이 없습니다.
해당 문의와 관련해서는 UNIT 39를 학습하세요. 학습 기록에서는 39.8 심사문제만 시도한 것으로 보입니다. 또한, 코딩도장 첫 이용기록이 23.9 심사문제부터로 기록되어 있습니다.
문자열 리터럴은 읽기 전용입니다. 대다수 C 언어 입문서는 리터럴(literal)이라는 표현을 잘 쓰지 않습니다. 그러나 C 언어 표준은 리터럴이라고 명확하게 정의내리고 있습니다. 이에 UNIT 7부터 리터럴이 등장하고 UNIT 10에서 상수와 리터럴을 구분해서 설명하고 있습니다.
int a = 10;에서 편의상 10을 숫자, 값으로 설명할 수 있지만, 10은 리터럴입니다.
10.1 리터럴 사용하기부터 차례대로 학습해보세요.
C 언어를 이미 어느 정도 알고 있더라도 복습하는 기분으로 처음부터 학습하는 것을 추천드립니다. C 언어 표준을 가능하면 가장 많이 반영하려 했고, 가능하면 정확한 용어를 사용하려 했습니다.
참고하세요.
처음부터 다시 학습하는 것을 권하는 이유는
구멍 뚫린 치즈 같은 지식을 쌓아서는 장기적으로 도움이 되지 않기 때문입니다.
<C 언어 코딩 도장>은 완전 학습에 기반하고 있습니다. 속이 꽉 찬 지식을 습득할 수 있도록 설계되어 있습니다.
const int a = 10;에서 a는 상수이고, 10은 리터럴이라고 이해하지 못하면 안 됩니다.
int b = 10;에서 b는 변수이고, 10은 리터럴입니다.
리터럴은 읽기 전용이고, 미리 할당됩니다. 동적 할당과 관련이 없습니다. UNIT 10을 꼭 학습하세요.