2011-10-11 2 views
1

입력 const 문자열을 어떤 방식 으로든 (C 컴파일러 경고가 발생 함) 수정하는 경우이를 처리하는 가장 좋은 방법은 무엇입니까? 새 변수로 유형 변환 한 다음이를 사용하거나 복제하는 것입니다. 그것을 사용하고 그것을 풀어. 또는 이런 유형의 시나리오를 처리하는 다른 방법이 있습니다. 제발 제안 해주세요. 어떤 도움을 주시면 감사하겠습니다.문자열 및 strdup 형변환

// 타입 캐스팅

const char * s1; 
char * s2 = (char *)s1; 

// 중복 무료

const char * s1; 
char * s2 = strdup(s1); 
free(s2) 

편집 : 그것은 C 컴파일러입니다; C++이 아닙니다. 타입 캐스팅에서 s2가 s1 문자열의 새 사본이 될지 또는 s1 문자열을 가리키고 있는지 확실하지 않습니다.

답변 해 주셔서 감사합니다. 나는 의심이 하나 더있다.

const char * c1; 
const char * c2 = c1; 

위의 할당은 유효합니까?

+0

const 문자열을 수정해야하는 이유에 대한 자세한 내용에 따라 다릅니다. –

답변

5

여기서 const를 버리면 컴파일러가 종료되지만 런타임 오류가 발생할 수 있습니다. 문자열의 사본을 만들고 그것에 대한 작업을하십시오.

const를 캐스팅해도 메모리 내용이 복사되지 않습니다. 그것은 단지 같은 메모리에 대한 포인터를 만들고 컴파일러에게 바로 갈 수 있고 그 메모리에 쓸 수 있음을 알려줍니다. 메모리가 읽기 전용 인 경우 보호 오류가 발생합니다. 더 심각하게 디버그하기 어려운 정정 문제를 가질 수 있습니다. const를 버리지 마라.

물론 변수를 수정하고 호출자가 수정할 수 있도록 수정해야하는 경우 처음부터 const로 변경해서는 안됩니다. 반면에 수정 사항이 함수에 대해 전용이되는 경우에는 const 매개 변수를 복제하는 것이 가장 좋습니다.

대개 가능한 경우 캐스트를 피하려고 시도해야합니다. 캐스트는 오류의 가장 빈번한 원인 중 하나입니다.

+0

추가 할 것이 많지 않습니다. 예를 들어 문자열 리터럴은 읽기 전용 메모리에 상주하며 const를 캐스팅하면 해당 메모리에 쓰려고하면 보호 오류가 발생합니다. const를 버리지 마라. –

0

입력이 const char* 인 경우 컴파일러 경고를 듣고 그대로 두어야합니다.

2

하면 s1const은 다음 를 수정하지 있어야합니다 것을 배열; 그렇게하면 정의되지 않은 동작이 발생합니다. 이 경우 수정해야 할 경우 사본을 받아야합니다. 업데이트 : 형변환은 아직 const 인 동일한 배열에 대한 포인터를 제공하므로 수정하지 않아야합니다 (그렇게하려고해도 더 이상 컴파일 오류가 발생하지 않음).

배열이 const이 아닌 것을 보장 할 수 있으면 포인터에서 const을 캐스팅하여 수정할 수 있습니다. 이 경우 먼저 const 한정자를 s1에 추가하지 않아도 해당 보증을 적용 할 수 있다면 오류가 발생하기 쉽습니다.

+0

내 경우에는 s1이 확실히 const입니다. 그렇다면 스트라이프가 타이 캐스팅보다 더 나은 옵션이라고 말하는 것입니까? – user32262

+1

바로 그게 우리 모두가 말하고있는 것입니다! –

+0

@ user32262 : 예, 포인터를 타입 캐스팅하면 동일한 배열에 대한 포인터가 생기며, 여전히 수정하면 안됩니다. 나는 명확하게 대답을 업데이 트했습니다. –

관련 문제