2016-12-02 3 views
0

문자열을 저장하기 위해 동적으로 메모리를 할당하는 함수가 있습니다 (문자열의 2D 배열 또는 문자의 3D 배열) char ***에 있습니다.동적 2D 배열 안에 문자열 리터럴을 저장하는 C

나중에 문자열 리터럴로 저장하면 더 좋을 것이라고 생각하여 배열을 const char ***으로 변경했습니다. 그러나 이것은 strcpy()free()을 사용할 때 오류가 발생합니다.

error: passing argument 1 of 'strcpy' discards 'const' qualifier from pointer target type 

나는 매개 변수 strcpy()free() 포획이 유형 char *void *의 것으로 알고 있습니다, 그러나 나는 또한 const char * 대신 char *에 문자열을 저장하는 좋은 방법이라고 읽었습니다.

문자열 리터럴을 strcpy() 또는 free()과 같은 작업에 사용할 수 없다면 어떻게 사용합니까? 방금 const char *** 대신 char ***으로 두어야합니까? 여기 내가 분명히 이해하지 못하는 무언가가 있습니다.

+1

'char ***'유형의 객체도 가리키는 객체도 문자열의 2D 배열 또는'char'의 3D 배열이 아니며, 그 자체가 서로 구별되지 않습니다. 더 일반적으로, 배열과 포인터는 전혀 같지 않으며 다차원 배열은 포인터의 배열이 아니라 배열의 배열입니다. –

답변

1

귀하의 배열에는 문자열 리터럴에 대한 포인터가 포함되어 있지 않지만 문자열 리터럴 사본이 포함되어 있다는 것을 알고 있습니다. 그렇지 않으면 strcpy는 무엇을 위해 사용됩니까? 따라서 배열 (또는 해당 포인터) 선언에서 const 한정자를 제거 할 수 있습니다. C 문자열 리터럴에는 상수가 아닌 배열 유형이 있습니다.

+0

만약'const char ***'를 사용하고 싶다면'strcpy()'를 사용하지 말고 문자열 리터럴을 직접 할당해야합니까? 예 : 'const char * a = "foo"; const char * b = a'? 하나의 자유 문자열 리터럴 ('const char *')을 하나합니까? – thestateofmay

+0

@thestateofmay 문자열 리터럴에 대한 포인터를 저장하려면 한정자 const를 사용할 수 있습니다. 문자열 리터럴에는 정적 저장 기간이 있습니다. –

+0

@testateofmay 하나는 동적으로 할당 한 객체 만 해제합니다. 문자열 리터럴은 동적으로 할당되지 않습니다 (정적 저장 기간이있는 Vlad의 발언에 의해 전달되지만 사용자가이를 인식하는지 확실하지 않습니다). –