문자열을 다루다 보면 어떤 입력을 받아와서 저장하고, 또 다시 입력을 받아서 저장하고, 이럴 일이 많다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ char temp[20]; char* save[20]; int i = 0; for (int ite = 0; ite < 5;ite++) { printf("$ "); scanf_s("%s", temp, sizeof(temp)); save[i] = temp; } printf("%s", save[0]); printf("%s", save[1]); printf("%s", save[2]); printf("%s", save[3]); printf("%s", save[4]); return 0; } | cs |
이렇게 쓰면 엄청난 문제가 발생한다. save[0 - 4] 까지 모두 같은 값을 가리키게 된다. 이런 이유는 save[i] = temp; 요기에 있다. temp라는 것은 문자열의 이름임과 동시에 그 문자열을 가리키는 포인터이다. 그래서 save의 변수형을 char *로 한 것이었다. 그런데 이 포인터가 가리키는 값들이 계속 바뀐다고 해서 새로운 메모리에 저장되는 것이 아니다. 그래서 이런 버그가 만들어지는 것이다.
그러면 어떻게 할 것인가!! 귀찮지만 새로운 메모리를 할당해서 이를 가리키게 만들어야 한다. 그래서 사용하는 함수가 strdup이다. 똑같은 크기와 내용을 가지는 문자열을 만들어서 그 시작 주소(포인터)를 반환한다.
그런데 윈도우 계열의 IDE(visual studio등)에서 이를 사용하면 컴파일 에러를 밷어낸다. 왜냐!! 이들에게 strdup는 표준이 아니다. 대신 _strdup를 사용해야 한다.
gcc계열이라면 strdup!!!
windows계열이면 _strdup..
'개발' 카테고리의 다른 글
C 언어 strtok & strtok_s (0) | 2019.01.10 |
---|---|
C 언어 - 자주 사용하는 함수 read_line (0) | 2019.01.10 |
C 언어 도서 관리 프로젝트 (0) | 2019.01.05 |
C 언어 - 두고두고 쓰기 위한 문자열 search 함수 (0) | 2019.01.04 |
파이썬 2차원 배열 생성 (0) | 2019.01.02 |