210113 개발일지(37일차) - c언어 알아보기(4) : malloc(), free()함수 등

고재개발·2021년 1월 13일
0

C Language

목록 보기
7/13

malloc()함수

malloc()함수는 memory allocationdml 약자로, 메모리를 할당하는 함수이다.
아래와 같이 사용하며, 힙 영역의 메모리에 int자료형 메모리크기(4byte)를 10개를 할당한다. int형의 주소값을 가리키는 x는, 힙 영역에 저장한 메모리의 시작 주소다.

아래와 같이 10개의 int자료형을 만들 수 있는 메모리를 할당해놓고 x[10], 즉 11번째에 접근해서 값을 주면 에러가 난다.
("Invalid write of size 4")

#include <stdlib.h>

void f(void)
{
    int *x = malloc(10 * sizeof(int));
    x[20]=0;
}

free()함수

free() 함수는 malloc()함수와 반대되는 함수로, 할당했던 메모리를 할당해제 해주는 함수이다.

문자열 이상한 점..

char* s = "gojae" 에서, g를 대문자로 바꾸고 싶다면 어떻게 해야할까?
단순히, char* s 를 활용해서 바꾸려고 하면.. 안된다.

int main(void)
{
    char* s = "gojae";
    printf("%c\n", *s);
    printf("%c\n", s[0]);
    s[0]='G';   // 이렇게 해도 안바뀌고
    printf("%s\n", s);
    *s='G';     // 이렇게 해도 안바뀐다.
    printf("%s\n", s);
}

왜 안될까? 추측하건데, char* s 로 s를 저장하면 건드릴 수 없는 주소값에 저장되는 것 같다.
여기 ROM영역에 저장되어.. 읽을 수만 있고 수정이 안되는 것으로 보인다.
따라서 수정하려면, 아래와 같이 새로운 't'를 활용해야 한다. 그런데 여기서도 이상한 점이 발생하는데.. malloc를 맥에서는 하지 않아도 되는데 윈도우에서는 해야한다. 이상한 점이 참 많군...요....

char* t = malloc(5);
// char* t ;    맥에서는 되는데, 윈도우에서는 안된다???
for (int i = 0; i < strlen(s)+1 ; i++)
    {
        t[i]=s[i];
    }
    
//혹은 strcpy(t, s); 활용
profile
고재개발

1개의 댓글

comment-user-thumbnail
2021년 1월 18일

힝 왜 안돼잉!! 이상해 궁금해 뚱뚜뚱뚜ㄸㅏ!

답글 달기