2017-03-09 5 views
-1

나는 이와 같은 버퍼를 만들지 만 내용을주지는 않습니다. 그런 다음이 블록 메모리의 strlen()을 봅니다. 내가 무엇을 얻을Strlen() 할당 된 포인터

int size = 24; 
    char *c; 
    c = (char *)malloc(size); 
    printf("%d\n", strlen(c)); 

내가 다 [47]에 [40] C에서 값을 보려고 나는 항상 \ 0을 얻을 수 있지만, C 후 [47] 더 이상 null이 아닌 24 만 (40)이 아니다. size = 18로 설정하면 결과가 더 이상 40이 아닙니다. 그것은 32입니다. 그리고 c [32]에서 c [47]까지의 값은 모두 \ 0입니다. size = 7로 설정하면 결과는 24이고 c [24]에서 c [47]까지의 값은 모두 \ 0입니다.
malloc() 함수에 사용 된 크기를 줄 수없는 것처럼 배열에 strlen을 사용한다는 것을 알고 있습니다. 저는 왜 이런 일이 일어 났으며 크기의 가치를 바꿀 때 결과가 어떻게 변하는 지 궁금합니다. 이것을 사용하여 우리가 처리 할 수있는 것이 있습니까?
편집 : 결과가 예측할 수 없다고 모든 사람이 생각하는 것처럼 보입니다. 항상 8의 배수이고 크기를 늘리면 결과가 증가하는 한계가 있습니다. 우리는 결과의 변화를 가져 오는 크기의 값을 정확하게 결정할 수 있으며, 테스트를 여러 번 반복하더라도 변경되지 않습니다. 그것은 C 언어 나 컴파일러가 아닌 OS에 의존합니까? 왜 8 명이 선정 되었습니까?

+3

정의되지 않은 동작, end of, case closed !! –

+0

사이드 노트 : [malloc의 결과를 캐스팅하지 마십시오] (http://stackoverflow.com/q/605845/1233251). –

답변

2

strlen()은 문자열 길이에 해당하는 설명서를 읽어야합니다. 세부 사항이 없으면 하나만 말해 드리겠습니다.

포인터의 길이를 동적으로 가져올 방법이 없으므로 나중에 저장하고 나중에 사용하는 것이 좋습니다.

간단한 우아한 방법은, 당신은 크기를 저장하는위한 struct을 사용하고 당신이 필요로하는 모든 시간을 사용하는 것입니다. 에 관해서는

struct pointer_type { 
    void *pointer; 
    size_t allocated_size; 
}; 

질문

귀하의 포인터, 초기화되지 않은 것입니다 "내가 무엇을 얻을 하지 24 만 40입니다." 이

int strlen(const char *const str) 
{ 
    int count = 0; 
    while (*(str++) != '\0') ++count; 
    return count; 
} 

처럼 무작위 쓰레기로 포인터 점 때문에, 주어진 문자가 발생할 때까지 문자를 포인터를 역 참조하고 계산하여 뭔가를 작동 strlen() 방법은,이 잘 작동하지 않기 때문에 정의되지 않은 동작으로 알려진 원인 반환 값은 예측할 수 없습니다.

+0

답변 해 주셔서 감사합니다. strlen() 함수에 대해 알고 크기를 얻고 싶지 않습니다. 실제로, 실제 질문은 포인터에서 포인터 + x까지의 바이트 값이 널 값이 처음 나타나는 위치와 같이 설정되는 방법입니다. –

+0

모든 테스트는 ** 정의되지 않은 동작 **으로 인해 신뢰할 수 없으므로 아무 것도 예측하지 못합니다. –

2

할당 한 메모리가 초기화되지 않았습니다. NUL 종료 문자열을 예상하는 함수 인 strlen에 전달하면 정의되지 않은 동작이 발생합니다. 그래서 당신은 무엇이든 얻을 수 있습니다. 어떤 결과를 얻을 필요조차 없습니다.

할당 된 메모리 블록의 정확한 크기를 알기 위해 C에 내장 된 방법이 없습니다.