2015-01-20 3 views
0

제어 할 수없는 이유 목록을 보려면 void * 포인터에서 참조해야하는 문자열 배열을 만들어야합니다. C++에서 다음 패턴을 따르는 것이 좋습니다.C++에서 malloc을 사용하는 문자열 배열

void* TP = malloc(sizeof (double) * SS); 
for (int i = 0; i < SS; i++) { 
    ((double*) TP)[i] = IStringToDouble(Token[i]); 
} 

여기서 Token은 벡터이고 SS는 int입니다.

void* TP = malloc(sizeof (string) * SS); 
for (int i = 0; i < SS; i++) { 
    ((string*) TP)[i] = Token[i]; 
} 

내가이 끔찍하게 잘못이라고 알고 있지만, 그것이 작동하지 않습니다에서 내가 시도하는 모든 수정을 시작 : 자, 템플릿을 사용하여, 비록 같은 것을 시작으로.

어떻게해야합니까? 가능한가?

Google 또는 StackOverflow에서 찾은 C++의 문자열 배열에 대한 모든 문서를 읽었지만 아무 것도 void *에서 배열을 참조하는 것과 관련된 문제는 다루지 않았습니다.

+2

C++에서 malloc을 사용하지 마십시오. 특히 std :: string이 아닙니다. – Borgleader

+0

안녕하세요. Borgleader, malloc의 유무에 관계없이 void * 포인터에 대한 요청을 수행하기위한 제안은 매우 유용 할 것입니다. –

+0

'Token [i]'란 무엇이며, 문자열은 어떻게 접근 할 것인가? –

답변

1
void* TP = malloc(sizeof (string) * SS); 
for (int i = 0; i < SS; i++) { 
    ((string*) TP)[i] = Token[i]; 
} 

이 끔찍하지만, 내가 어떻게 작업을 진행하는 것을 무시하고이 생겼습니다 이유를 설명하고 있습니다 ....

malloc()는 메모리를 할당하지만 임의의 객체를 생성하지 않습니다. string의 경우 생성자를 호출해야합니다. 그렇지 않으면 string 인스턴스에 string 개체가 실제 텍스트 데이터에 대한 메모리 포인터라고 가정하는 초기화되지 않은 포인터 멤버가 포함됩니다. ((string*) TP)[i] = Token[i];은 용량을 보장하고 이러한 가비지를 기반으로 메모리를 덮어 씁니다. 값.

것은이 문제를 해결하려면, 문자열의 각 구성하기 위해 배치-new 연산자를 사용하여 명시 적으로 소멸자를 호출하여

void* TP = malloc(sizeof (string) * SS); 
for (int i = 0; i < SS; i++) { 
    new (&((string*)TP)[i]) std::string(Token[i]); 
} 

당신은 나중에 유사 string의를 파괴해야 한 다음 free() 배열 .

+0

안녕하세요, Tony, 메모리 할당에서 초기화되지 않은 문자열에 대해 잘못 알고 있다고 정확히 지적하셨습니다. "새로운"라인을 확인해 주시겠습니까? 괄호 문제가있는 것으로 보입니다. –

+0

고맙습니다. 원본 템플릿과 완벽하게 유사합니다. –

+0

'& ((string *) TP) [i]'는'i + (string *) TP', btw로 단순화됩니다. –

4

포인터를 void*으로 변환 할 수 있습니다. 이 아니고malloc을 사용해야하고 이 아니어야합니다.은 개체에 대한 유일한 포인터로 void* 포인터가 있어야합니다.

염두에두고, 그렇게하지 않으시겠습니까?

string* TP = new string[SS]; 
for (int i = 0; i < SS; i++) { 
    TP[i] = Token[i]; 
} 

void *TP2 = TP; 

또는

조차 :

두 번째 방법으로, 포인터가 당신이 Token에 더 많은 요소를 추가하고,이 포인터를 통해 문자열을 수정하면에있는 문자열을 수정합니다 경우 무효가됩니다,하지만
void *TP = &Token[0]; 

Token (포인터가 가리키고 있기 때문에).

+0

안녕하세요, 안녕하세요, 대단히 감사합니다. 정확하게 원했던대로 작동했습니다. 질문을 게시하기 전에 비슷한 솔루션을 시도했지만 TP 배열을 캐스팅하기 위해 다른 변수를 사용하면 차이가있었습니다. –

+0

'std :: vector '는'new string []'보다 훨씬 낫습니다. '& TP [0]'또는'TP.data()'를 사용하여'vector'의 첫번째 요소에 대한 포인터를 얻을 수 있습니다. –

관련 문제