안녕하세요 두가지 질문이 있습니다.
char *numArr = malloc(sizeof(char) * 10);로 했을때 lenstr(numArr)은 15가 되는데요, 이 값이 어떻게 나온것인지 잘 이해가 안돼요 ㅠ.ㅠ 또 아래 루프를 돌리고 싶은데
void pointerAdd() {
char *numArr = malloc(sizeof(char) * 10);
for (int i = 0; i <= strlen(numArr); i++) {
numArr[i] = rand()%10;
printf("%x %x %d %d\n", numArr + i, &numArr[i], *(numArr + i), numArr[i]);
}
free(numArr);
}
루프가 i=15까지 돌아가지 않고 중간에 중단됩니다. 왜이런가요?.?
또 sizeof(numArr)=4이지만
포인터연산으로 증가시킨 주소는 sizeof(char)인 1씩만 움직이고있어요
이거는 왜그런가요?.?
코드를 알 수 없고, 아마도 거의 무의미한 코드일 겁니다.
UNIT 63까지 학습하면서 예제 코드를 숙지하면서 기본 작성법을 익히는 게 좋습니다.
1번 읽고, 2번 읽으면서 실습해보세요.
심사문제는 꼭 푸세요. 심사문제를 풀면 많이 발전합니다.
char *cPtr = malloc(sizeof(char)); // char의 크기 1바이트만큼 동적 메모리 할당
memset(cPtr, 0, sizeof(char)); // char의 크기 1바이트만큼 0으로 설정(올바른 방법)
memset(cPtr, 0, sizeof(char *)); // 32비트: char 포인터의 크기 4바이트만큼 0으로 설정(잘못된 방법)
// 64비트: char 포인터의 크기 8바이트만큼 0으로 설정(잘못된 방법)
free(cPtr);
귀한시간 내주셔서 정말 감사드립니다.
틈틈히 재밌게 하고있어요 ㅇ.ㅇ 100%달성하겠습니다.
좋은 곳을 만들어주셔서 정말 감사해요
홧팅!
메모리가 왜 깨끗하지 않냐면 안 쓴다고 메모리를 지우는 게 더 느리고, 시간이 오래 걸리니까요.
할당하고, 기록하고, 읽으면 되고, 할당을 해제하면 지우지 않고 그냥 놔두는 겁니다.
하드디스크도 똑같습니다. 1TB짜리 파일을 삭제한다고 모두 0으로 지우면 삭제하는데 6시간 이상 걸릴 겁니다. 그래서 실제 파일은 두고, 파일을 관리하는 장부에서만 삭제합니다. 장부에서만 삭제하니까 삭제된 파일이라고 해도 복구가 가능한 겁니다. 장부만 지웠지, 데이터는 그대로 있으니까요. 데이터까지 소거하는 프로그램을 쓰면 몇 시간이 걸리죠.(Harddisk Wiper로 검색하면 무료 프로그램 많은데, 잘못 쓰면 복구도 못하고 다 날아갑니다)
메모리도 똑같습니다. 게다가 메모리는 전원을 끄면 정보가 사라지죠.
효율을 위해 할당하고, 바로 씁니다. 초기화가 필요할 때만 초기화를 하고요.
할당하면 자동으로 0으로 다 채워주고, 해제하면 자동으로 다 0으로 채워주는 현대 운영체제나 파일시스템이 있는지는 모르겠지만, 기본 동작 원리는 저렇습니다.
윈도우, 리눅스, 맥, 안드로이드, iOS, 무엇을 쓰든 메모리는 항상 지저분한 상태이고, 파일 시스템도 지저분한 상태입니다.