[완료]C로 문자열 swap 함수를 만드는 도중 의문이 들었습니다.

leehipo의 이미지

C로 두 문자열을 swap하는 함수를 만들고 있었는데, 불현듯 의문이 생겨 질문드립니다.
처음에 제가 작성한 코드는 아래와 같습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 128
 
void main()
{
	char* data[] = {"Mon", "Tue"};
	char tmp[MAX];
 
	strcpy(tmp, data[0]);
	strcpy(data[0], data[1]);
	strcpy(data[1], tmp);
 
	printf("%s\n", data[0]);
	printf("%s\n", data[1]);
}

data[]라는 문자열배열을 정의하고, 두 문자열을 strcpy를 통해 swap 합니다.
전혀 문제가 없어보이는데 막상 실행하면 프로그램이 죽어버립니다.
혹시나해서 아래와 같이 구현해봤는데...
아래와 같은 경우는 잘 동작하더군요.

void main()
{
	char data1[MAX] = "Mon";
	char data2[MAX] = "Tue";
	char tmp[MAX];
 
	strcpy(tmp, data1);
	strcpy(data1, data2);
	strcpy(data2, tmp);
 
	printf("%s\n", data1);
	printf("%s\n", data2);
}

왜 문자열배열(char* data[])를 이용해 swap 하는 것은 안되고.
독립적인 두 문자열(data1, data2)은 swap이 되는건가요?

도움부탁드립니다~

Hezekiah의 이미지

이건... 데이터의 변경이 안되지 않나요;;

char *tmp = "ddd";

이런 경우 tmp의 내용을 읽어올 수는 있지만... 문자열 상수라서... 내용 변경이 안되는 것으로 알고 있습니다. 그러한 문제가 아닐까요;ㅋ 런타임 에러가 발생할 때 무슨 에러가 나오는지 확인해보시면 알 수 있을 듯 한데요;;

* Everything is not accomplished *

leehipo의 이미지

잊고있었네요! 감사합니다.

emptynote의 이미지

저두 막 다시 C & C++ 공부를 시작할려니 질문하신 답을 몰라서 찾아 보았습니다.

같이 공부하는 처지에 도움이 되었으면 하네요.

참고 url : http://www.winapi.co.kr/ApiBoard/content.php?table=tblqa&pk=43758

======== 부분 인용 ======
...................
...................
문자열 상수는 코드영역에 기억됩니다.
일반적으로 만들어진 실행파일이 메모리에 로드될 때, 코드 영역은 읽기 전용 속성을
가지기 때문에 문자열 상수를 변경하려고 하면 Access violation이 발생하는 것이고
.............
.............