본문 바로가기

개발

C 언어 - strdup / _strdup

문자열을 다루다 보면 어떤 입력을 받아와서 저장하고, 또 다시 입력을 받아서 저장하고, 이럴 일이 많다. 


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..