2013-08-06 2 views
1

두 개의 C- 문자열을 병합하는 간단한 함수를 작성했습니다. 새로운 메모리 덩어리를 동적으로 할당하려고 시도하면서 나는 다음을 발견했다 :새로운 것은 너무 많은 메모리를 할당합니다.

char * out = new char[size]; 
std::cout << strlen(out) <<std::endl; 

크기가 4 일 때 16을, 크기가 22 일 때 40을 반환한다. 누구나 그런 역할을하는 이유와 특정 갯수의 문자로 C- 문자열을위한 메모리를 할당하는 방법에 대한 아이디어가 있습니까? 메모리를 초기화하지 않는 메모리를 할당 할 new을 사용하여

+1

문자열을 초기화하지 않습니다. 'strlen()'은 0으로 끝나는 버퍼가 필요합니다. 너무 많은 시간을 물어 ... –

+2

멍청이 - 질문에 strlen()을 보자 마자 .... –

+0

이것은 제안 된 원본의 복제본입니다 명확하지 않습니다. 그 질문은 초기화 된 배열에'strlen'을 적용하는 것이었지만, 종결 널 문자를 포함하지 않았습니다. 이 질문은'strlen'을 초기화되지 않은 배열에 적용합니다. 혼란이'strlen'이 어떻게 작동하는지,'new'가 배열을 초기화하는 방법과 할당 방법에 관한 것인지 아닌지에 대해서는 의문의 여지가 없습니다. –

답변

0

: 할당 된 메모리가 초기화되지

char * out = new char[size]; 

// Add this code to initialize out 
memset(out,'A',size-1); 
out[size-1]='\0'; 

std::cout << strlen(out) <<std::endl; 
+1

기술적으로'new char [size]()'는 여전히'new'을 사용하고 있습니다. – chris

+0

그것은 단지 코드 조각입니다. 그 후 나는 for-loop를 사용하여 정확한 숫자 (변수 '크기'와 동일한)를 char의 'out'char *에 넣습니다. 그리고 예를 들어 - 'aabb'문자열 대신 'aabbrrrrzzzzzzzz' – pawels1991

+1

@ pawels1991이 있는데 그 중 하나가 null 종결 자입니까? – chris

5

. strlen()은 null 문자 ('\0')가 발생할 때까지 메모리를 통해 충전을 계속합니다. out이 가리키는 메모리를 초기화하지 않았으므로이 메모리의 내용은 정의되어 있지 않으므로 strlen()의 동작도 정의되지 않습니다.

strlen()는 할당의 크기를 측정하지 않기 때문에 사용하는 도구는 전혀 그렇게하지 않는 할당의 크기를 측정하기 때문에 단순히 new가 너무 많은 메모리를 할당하는 것이 당신의 해석은 올바르지 않습니다.

귀하의 경우 strlen()이이 할당 범위를 넘어서고 있습니다. 이 상황에서는 결과가 "잘못된"값 (여기에서 보았 듯이)이거나 프로그램이 간단히 중단 될 수 있습니다.

+0

'new'는 생성 한 객체를 초기화하고 다른 객체는 초기화하지 않기 때문에이 할당이 할당 된 메모리를 초기화하지 않는 이유를 설명하는 것이 유용 할 수 있습니다. –

관련 문제