혹시나 저와 같은 불편함을 겪을 분들을 위해 남깁니다. MCAFEE 보안 프로그램 사용하시는 분들은 run 했을 경우 fail 했다는 메세지가 뜨실 수도 있습니다. 보안으로 인해 fail뜨는 것이고 보안프로그램을 잠시 해제 하신다면 정상적으로 수행됩니다. 좋은 강의 잘보고있습니다.
밑에 Y님과 Ky P님의 질문을 바탕으로 하는 질문이 있습니다. *(pc+26)=0 이 'z'후 null ('\0')를 삽입하는 것인데 그럼 pc라는 포인터가 그 null도 포함하는 것인가요? 예를 들어 pc 저장후 free 하기전 또 다른 포인터 pc2를 정의할때 pc2는 z 후부터 정의되나요 아님 null 인가요? 감사합니다.
2번째 예제에서는 printf("%s ", pc); 이고 3번째 예제에서는 printf("%d ", *(pi+i)); 인 이유가 궁금합니다. 2번째예제에서 *pc로 하면 오류가 발생하는데 주소가 아닌 값을 출력해야하기 때문에 printf("%s ", *pc);가 되야하는 것 아닌가요?
예제 2번의 pc는 char형 배열 즉, 문자열의 시작주소를 나타내므로 *pc는 크기가 27인 배열 pc의 0번째 인덱스 값 'a'를 가리킵니다. 이는 char형 즉, 문자열이 아닌 문자이므로 %s형식자가 아닌 %c형식자를 사용해서 출력해야 합니다. 2번 예제에서 printf("%s ",pc);인 이유는 위에서 말씀드린것 처럼 문자열을 출력하기 위함입니다. 그리고 3번에서는 포인터 참조 연산자를 사용한 이유는 문자열 전체가 아니고 인덱스 각각의 값을 문자형으로 출력하기 위해서 입니다.
pi는 포인트 인테저의 약쟈이다.malloc메모리를 할당하라는 의미임 . exit(1)은 지금 프로그램을 종료한다는 의미임. 동적 메모리를 사용하면 메모리 안전성과 효율성을 위해 free(pi)로 무조건 반환함.//stdlib는 동적메모리를 위한 헤드업파일임.아스키코드 0은 NULL을 의미함.free(pc); 로 메모리 할당을 해제함.
처음 예제에서 pi = (int *)malloc(sizeof(int)); 여기에 sizeof(int)대신 4를 넣어도 된다 하셨는데, pc = (char *)malloc(100 * sizeof(char));여기서 100*안하고 그냥 100만 넣어도 괜찮은건가요? pc = (char *)malloc(100 ); 이런 식으로요!
%s가 이런 식으로 작동을 해요 while(*pc != '\0') { printf("%c",*pc); // pc의 값 출력 pc++; //pc의 다음 주소 } 보면 시작주소를 알아야 해당 주소의 값을 출력하고 또 다음주소의 값도 출력할 수 있는데 그냥 값만 주면 원하는 결과가 안 나올거에요
궁금한게 있는데, 예제 2에서 printf("%s ", pc); 하면 왜 a~z까지 나오나요? 배열은 하위 요소와[0~n]까지 그룹화 되있다고 생각할 수 있는데, 포인터는 *(pc+i)를 해준 것일 뿐 그룹화를 하지 않았잖아요? for 문으로 *(pc+i)를 안해줬는데, 왜 pc 하위 i 값까지 쭉 출력 되는지 궁금합니다.
malloc은 기본적으로 void 형으로 할당 되어지기 때문에 내가 원하는 형으로 변환 시켜주는 겁니다. float이 필요하면 (float *)로 해주고 int가 필요하면 (int *)로 형 변환 시켜주는겁니다. 이렇게 형변환을 안해주면 컴퓨터 입장에서는 무슨 형으로 쓸 지 모르기 때문입니다.
이미 해결하셨을것 같긴한데, malloc(5 * sizeof(int))의 크기만큼 먼저 메모리에 할당하고,그 할당된 공간의 데이터 형을 (int *)형으로 변환하라는거에요. malloc함수가 크기만큼 할당하라고 전달하면 할당된 메모리의 주소값을 void*형으로 반환하거든요. 예를들어 malloc(sizeof(int))로 4바이트를 할당했을 때, 이 공간을 어떤 용도로 사용하게 될 것인지 컴퓨터는 예측할수 없어요. float형으로 쓸 것인지 int형으로 쓸것인지 용도를 정하는건 프로그래머라서 void*값으로 반환될 공간을 앞서 선언한 데이터형에 따라 (int*)나 (float*)를 사용해 변환해주는거에요. 결론은 (int *)는 반복되는게 아니라/ 어떤 용도인지 알 수 없는 malloc함수의 크기만큼 할당 된 공간을/ 변수 pi에 저장하기 위해서/ *pi의 데이터 형인 int와 대응시킨 것입니다. 자세한 내용은 dsnight.tistory.com/51 이곳이 이해하기 쉽게 정리가 잘되어있더군요
진짜 이번 영상은 설명이 자세해서 너무 좋네요... 이해가 잘되고 재밌어서 영상보면서 꾸준히 공부하고 있어요!
넘 감사히 강의 잘보고 있습니다
제 구원자이십니다ㅠㅠㅠ4년전 동빈님 감사합니다ㅠㅠㅠㅠㅠ
존경스러워요. 아직 복학준비 하느라 모든게 두렵네요 ㅠㅠ 얼른 복학하고 4학년 되야 시간내서 좀 대외활동도 하고 그리고 취업까지 가야 하는데 앞으로 최소 4년 진짜 성실하게 열심히 해야 겠어요
잘 봤습니다!
궁금한게 있는데요, 다양한 언어를 강의하실 만큼 다 잘하실 수 있는 방법이 뭔가요?
대단하시네요. 해드릴 것은 딱히 없고, 강의 볼 때마다 광고 끝까지 시청하겠습니다~
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 감사합니다. 그냥 컴퓨터 공부하는 게 재미있고 제 전공이 컴퓨터교육이라서, 다양한 강좌를 찍고 싶다는 욕심이 있을 뿐입니다.
진짜 대단함!!
혹시나 저와 같은 불편함을 겪을 분들을 위해 남깁니다.
MCAFEE 보안 프로그램 사용하시는 분들은 run 했을 경우 fail 했다는 메세지가 뜨실 수도 있습니다.
보안으로 인해 fail뜨는 것이고 보안프로그램을 잠시 해제 하신다면 정상적으로 수행됩니다.
좋은 강의 잘보고있습니다.
가피는 오가피가 최고입니다.
강의 정말 잘 보고 있습니다!! 감사합니다^^
안녕하세요 강의 정말 잘 보고 있습니다~ 감사해요!!!!
꺅~~
밑에 Y님과 Ky P님의 질문을 바탕으로 하는 질문이 있습니다. *(pc+26)=0 이 'z'후 null ('\0')를 삽입하는 것인데 그럼 pc라는 포인터가 그 null도 포함하는 것인가요? 예를 들어 pc 저장후 free 하기전 또 다른 포인터 pc2를 정의할때 pc2는 z 후부터 정의되나요 아님 null 인가요? 감사합니다.
너무 잘 알려주셔서 감사합니다.
동적메모리 할당은 왜 필요한건가요?? 배열처럼 메모리를 계속잡아두지않고 반납하기때문에 프로그램에서 메모리를 좀 더 효율적으로 사용하기위해서인가요??
완강했습니다. 감사합니다!
영어발음이진짜찰지네옄ㅌㅋㅌㅌㅌㅋㅋ 잘보구갑미당^-^
2번째 예제에서는 printf("%s
", pc); 이고 3번째 예제에서는 printf("%d
", *(pi+i)); 인 이유가 궁금합니다. 2번째예제에서 *pc로 하면 오류가 발생하는데 주소가 아닌 값을 출력해야하기 때문에 printf("%s
", *pc);가 되야하는 것 아닌가요?
아뇨 *pc는 알파벳 a의 아스키코드값입니다 pc자체가 알파벳을 나타내는거에요 printf("%d",*pc)를 해보시면 a의 아스키코드 값인 97이 나오는걸 확인하실 수 있습니다
2번째 예시는 char이고 3번째 예시는 int라서 헷갈리시는 것 같은데요. 3번째 예시에서 100~500를 'a','b',...'e'로 바꿔서 해보시면 이해가 더 잘 되실겁니다
예제 2번의 pc는 char형 배열 즉, 문자열의 시작주소를 나타내므로 *pc는 크기가 27인 배열 pc의 0번째 인덱스 값 'a'를 가리킵니다. 이는 char형 즉, 문자열이 아닌 문자이므로 %s형식자가 아닌 %c형식자를 사용해서 출력해야 합니다. 2번 예제에서 printf("%s
",pc);인 이유는 위에서 말씀드린것 처럼 문자열을 출력하기 위함입니다. 그리고 3번에서는 포인터 참조 연산자를 사용한 이유는 문자열 전체가 아니고 인덱스 각각의 값을 문자형으로 출력하기 위해서 입니다.
주소 자체가 abcd이렇게 영어라는 말이라는게 아닐까요?
근데 문자열에서 더이상 출력할 문자가 없으면 나머지 빈 배열을 자동으로 \0으로 채워넣는걸로 알고있는데, 굳이 널값을 z문자열이 끝난다음에 넣어줄 필요가있나요??
*(pc+i) = 0; 빼고 실행해봐도 문제없이 돌아가는거같은데
pi는 포인트 인테저의 약쟈이다.malloc메모리를 할당하라는 의미임 . exit(1)은 지금 프로그램을 종료한다는 의미임.
동적 메모리를 사용하면 메모리 안전성과 효율성을 위해 free(pi)로 무조건 반환함.//stdlib는 동적메모리를 위한 헤드업파일임.아스키코드 0은 NULL을 의미함.free(pc); 로 메모리 할당을 해제함.
char와 다르게 int *pc = NULL; 을 안해준 이유가 있을까요?
char는 array 형이니, NULL을 해줘야하고 int는 안해줘도 되는 그런걸까요..?
항상 좋은 강의 감사드립니다 :)
처음 예제에서 pi = (int *)malloc(sizeof(int)); 여기에 sizeof(int)대신 4를 넣어도 된다 하셨는데, pc = (char *)malloc(100 * sizeof(char));여기서 100*안하고 그냥 100만 넣어도 괜찮은건가요? pc = (char *)malloc(100 ); 이런 식으로요!
char*형이라 상관은 없을거 같은데 다른 자료형에서 그렇게 사용하시면 원하시는 만큼 할당 할 수가 없어요. int포인터에서 *sizeof(int)없이 100만 넣으면 25개만 할당 될 거에요
선추 후감상~
두번째 코드에서 printf("%s"
,pc); 이 부분에 pc가 *pc가 아닌거죠..? 첫번째랑 마지막 코드는 *pc로 썼는데 두번째만 다른 이유가 궁금합니다!!
%s가 이런 식으로 작동을 해요
while(*pc != '\0')
{
printf("%c",*pc); // pc의 값 출력
pc++; //pc의 다음 주소
}
보면 시작주소를 알아야 해당 주소의 값을 출력하고 또 다음주소의 값도 출력할 수 있는데 그냥 값만 주면 원하는 결과가 안 나올거에요
19강/20강 고비다 ㅜㅜ 다시 한번 듣기
int *pi;
char *pc = NULL;
왜 *pc는 NULL을 지정해줘야 하는건가요?
#include
#include
int main(void)
{
int *pi, i;
pi = (int *)malloc(5 * sizeof(int));
if(pi == NULL)
{
printf("동적 메모리 할당에 실패했습니다.
");
exit(1);
}
pi[0] = 100;
pi[1] = 200;
pi[2] = 300;
pi[3] = 400;
pi[4] = 500;
for(i = 0; i < 5; i++)
{
printf("%d
", *(pi + i));
}
free(pi);
return 0;
}
pi[]에 몇을 넣든 100만 출력되네요 왜 이럴까요?
컴파일링 하니까 z다음에 ?Appdata\local 이라고 뒤에 붙는데 이건 Appdata의 local 폴더에 저게 생성 되었다는 말인가요?
깔끔하게 z까지만 나오지는 않네요;;
궁금한게 있는데, 예제 2에서 printf("%s
", pc); 하면 왜 a~z까지 나오나요? 배열은 하위 요소와[0~n]까지 그룹화 되있다고 생각할 수 있는데, 포인터는 *(pc+i)를 해준 것일 뿐 그룹화를 하지 않았잖아요? for 문으로 *(pc+i)를 안해줬는데, 왜 pc 하위 i 값까지 쭉 출력 되는지 궁금합니다.
for 반복문을 알파벳개수 26개까지 해서 그런것 아닐까요?
%s은 문자열을 출려하는 것이기 때문에 시작 포인터부터 null이 나올때까지 쭉 출력합니다.
해당 코드에서 *(pc+i)=0; 으로 마지막에 null값을 넣어줬기 때문에 문자열처럼 작동하는 겁니다. 이 부분을 빼고 출력을 해보시면 알 수 있습니다.
다 b로 나오는 건 어떤 오류인가요?
근데 왜 pc가 포인터인가요? 그냥 일반변수로 지정하면 안 되나요?
for (i = 0; i < 5; i++) {
printf("%d
", *(pi+i));
}이거랑for (i = 0; i < 5; i++) {
printf("%d
", pi[i]);
}무슨차이인가요? 값은 같은걸로 나오는데위에거는 주소값이고 아래거는 pi[i]의 값 아닌가요??
조진희 별이붙었자나용
array니까 pi는 주소 *pi는 값
똑같은거에요 *이 붙었기 때문에 pi+i(주소값)이 가리키는 값입니다.
동적메모리로 알파벳 출력하기에서 20번 째 줄에
*(pc + i) = 0;
아스키 코드에서 0은 NULL을 의미하는 건 알았는데
왜 꼭 NULL을 넣어줘야 하는지 이해가 잘 안됩니다 ㅠㅠ
NULL이 문자열이 끝났다는 것을 알려주는 신호라고 생각하시면되요 !
컴퓨터가 쭉~~ 읽다가 NULL을 보고, "아! 여기서 문자열이 끝나는군!" 이라고 알려준다고 이해하시면 되요.
@@허새-u8w 아 감사합니다 ㅎㅎ 이해됐습니다
@@허새-u8w 근데 문자열에서 더이상 출력할 문자가 없으면 나머지 빈 배열을 자동으로 \0으로 채워넣는걸로 알고있는데, 굳이 널값을 z문자열이 끝난다음에 넣어줄 필요가있나요??
*(pc+i) = 0; 빼고 실행해봐도 문제없이 돌아가는거같은데
*int 형변환이 무슨뜻인지 잘 이해가안갑니다..ㅠ
malloc은 기본적으로 void 형으로 할당 되어지기 때문에 내가 원하는 형으로 변환 시켜주는 겁니다. float이 필요하면 (float *)로 해주고 int가 필요하면 (int *)로 형 변환 시켜주는겁니다. 이렇게 형변환을 안해주면 컴퓨터 입장에서는 무슨 형으로 쓸 지 모르기 때문입니다.
흐///... 역시 동적은 아래 파트랑은 차원이다르군
근데 이해하니까 뭐든 쉽긴한데 유독 동적만..
17:24
int *pi;
pi = (int *)malloc(5 * sizeof(int))
라고 할 때
(int *)는 반복되는 거 아닌가요?
pi가 가르키는게 int다. 라는 의미로 이해했는데, 이게 맞다면 왜 중복해서 쓰는지 알려주세요!
이미 해결하셨을것 같긴한데, malloc(5 * sizeof(int))의 크기만큼 먼저 메모리에 할당하고,그 할당된 공간의 데이터 형을 (int *)형으로 변환하라는거에요.
malloc함수가 크기만큼 할당하라고 전달하면 할당된 메모리의 주소값을 void*형으로 반환하거든요.
예를들어 malloc(sizeof(int))로 4바이트를 할당했을 때, 이 공간을 어떤 용도로 사용하게 될 것인지 컴퓨터는 예측할수 없어요.
float형으로 쓸 것인지 int형으로 쓸것인지 용도를 정하는건 프로그래머라서
void*값으로 반환될 공간을 앞서 선언한 데이터형에 따라 (int*)나 (float*)를 사용해 변환해주는거에요.
결론은 (int *)는 반복되는게 아니라/ 어떤 용도인지 알 수 없는 malloc함수의 크기만큼 할당 된 공간을/ 변수 pi에 저장하기 위해서/ *pi의 데이터 형인 int와 대응시킨 것입니다.
자세한 내용은 dsnight.tistory.com/51 이곳이 이해하기 쉽게 정리가 잘되어있더군요
그렇다면 그 공간 자체를 상수 취급 할 수 있게 되어 printf ("%s", pc)가 가능한건가요? pc는 주소인데 주소를 출력하는 것이 왜 문자열을 출력하게 되는 건지 궁금했거든요 ㅠ_ㅠ
@@혜성-m2m %s는 서식문자로 문자열 메모리의 시작 주소를 받아 null 값이 나올때까지 문자열로 인식하고 출력합니다.
와우
동적 메모리
왜...안될까요....
픟?라고뜨는 건왤까요??/./
%s를 %c라고 쓰셔서 그럴거에요!
값에 는 갑세 라고 발음해야해요.. 가페는 갚에를 발음하는겁니당..
발음 지적 감사합니다!! 앞으로는 유의해서 강의 촬영하겠습니다. 최근 강의에서는 '값을' → [갑쓸]이라고 정확히 발음하고 있습니다!