ft_lstdelone
에 맞는 main코드를 짜던 중 자꾸 버그가 발생한다.
이렇게도 고쳐보고, 저렇게도 고쳐보았지만 자꾸 에러가 난다.
문제의 코드 내용을 요약해보면 다음과 같다.
code
int main(void)
{
char *p1;
p1 = (char *) malloc(sizeof(char) * 4);
*p1 = "abc";
printf("%s\n",p1);
free(p1);
return(0);
}
output
�
'*p1
이 첫번째 문자 1개만의 자리값만 나타내서 그런가...?' 싶어서 다음과 같이해봤다.
code
int main(void)
{
char *p1;
p1 = (char *) malloc(sizeof(char) * 4);
p1 = "abc";
printf("%s\n",p1);
free(p1);
return(0);
}
output
abc
untitled(20228,0x1062f55c0) malloc: *** error for object 0x100204fa2: pointer being freed was not allocated
untitled(20228,0x1062f55c0) malloc: *** set a breakpoint in malloc_error_break to debug
그랬더니 어찌어찌 출력이 되는거 같긴한데 free()
에서 에러가 떴다.
인터넷에 검색해보았더니, malloc할당 후 string입력은 대부분 scanf()
, strcpy()
을 이용하는 예제 뿐이었다.
""
를 사용해서 입력하는게 왜 안되는지 의문스러웠다.
동료분의 조언으로 p1 = "abc"하기 전과 후의 p1의 주소를 비교해 보니 다음과 같았다.
code
int main(void)
{
char *p1;
p1 = (char *) malloc(sizeof(char) * 4);
printf("%p\n",p1);
p1 = "abc";
printf("%p\n",p1);
free(p1);
return(0);
}
output
untitled(21994,0x113ffc5c0) malloc: *** error for object 0x105d68faa: pointer being freed was not allocated
untitled(21994,0x113ffc5c0) malloc: *** set a breakpoint in malloc_error_break to debug
0x7fc5f6400620
0x105d68faa
여기서 뭔가 생각과 다르게 돌아가고 있는것을 느꼈다.
"
)로 묶인 것들을 문자열 리터럴(string literal)이라 부른다.char *pstr = "goodbye";
printf("why so serious?");
scanf("%c", str[0]);
goodbye
, why so serious
, %c
이다.text segment
)에 모아 보관한다text sagment
에 저장되어 읽기전용으로 관리되어 지니, 나 혹은 컴퓨터에 의한 버그로 값이 바뀌는일은 생길 수 없다.*p1
는 sizeof(char) * 1
의 크기를 갖고 있으므로 여러개의 값을 가진 string을 넣을 순 없다.p1 = "321";
코드가 동작되면서, p1
은 기존에 갖고있던 malloc된 주소값 말고 리터럴 주소값인 "321"의 주소를 가리킨다.free()
에서 오류가 나는 이유는 p1
은 더 이상 동적할당된 값이 아닌, 리터럴 주소값을 가리키기 때문이다.*(p1+1) = '1';
*(p1+2) = '2';
*(p1+3) = '3';
위 코드 처럼 일일이 넣을 수 밖에없다.
strcpy()
를 많이 사용한다.strcpy()
는 내가 짰을때처럼 할당된메모리를 하나씩 대입해서 넣도록 돌아가기 때문에 위 코드처럼 일일히 넣는것과 동일하게 동작된다.참고 링크 :
사실 내가 쓴 글 보단 아래 링크 내용을 보는게 낫다.
https://modoocode.com/33