vc ++ 디버거에서 strlen ()이 를 반환하는 이유는 무엇입니까? [닫은
-
05-09-2019 - |
문제
C ++ 유형의 문자열이 있습니다 const char*
Strlen에게 논쟁으로 통과되었지만 무효가되게됩니다.
그것은 비슷합니다
strlen(astruct.string);
감사..
편집 : 약간의 확인을했고
strlen("test");
여전히 빈 공간을 준다 .. 왜?
편집 : 여기 이미지가 있습니다http://img14.imageshack.us/img14/1808/strlen.png
이전에 불분명 한 죄송합니다. 서식은 잘 작동하지 않았습니다. 어쨌든, 혼란은 Evan Teran과 Vlad Romascanu에 의해 해결되었습니다. 또한 Brian R. Bondy의 대답을 살펴보십시오.
감사. 자유롭게 닫으십시오.
해결책
스크린 샷 참조 : 디버거가 표시됩니다. <void>
~을 위한 strlen(...)
실제로 오류가 표시되어야합니다.
디버거 시계에서 메소드를 호출하고 결과를 표시 할 수 없습니다. 디버거는 기존 변수와 데이터 만 표시됩니다. 방법이 코드의 저자 나 디버거에 의해 예상되지 않은 방식으로 디버깅되는 프로그램의 상태를 변경할 수 있기 때문에 요청시 임의의 메소드를 호출 할 수 없습니다.
당신이 할 수있는 것은 코드에서 일시적으로 추가하는 것입니다.
size_t tmp_len = strlen(struc.string);
그런 다음 컴파일 한 다음 TMP_LEN을 시계에 추가하십시오.
다른 팁
Visual Studio 6.0의 엉뚱한 디버거에 의해 혼란스러워합니다. 이것에 의존하지 마십시오. 인라인 또는 비슷한 무언가로 인해 반환 값을 얻을 수 없었을 것입니다.
실제 가치를 얻으려면 값을 인쇄하십시오.
편집 : 또한 예에서, 당신은 어쨌든 strlen의 결과를 저장하지 않을 것 같습니다. 이것은 또한 디버거가 반환 값을 보지 못하는 이유 일 수도 있습니다. 컴파일러가 값을 사용하지 않으면 실제로 strlen을 실행할 필요가 없다고 결정했을 가능성이 있습니다.
참고 :이 시점에서 아직 VC ++ 6.0 사용. 그것은 고대 컴파일러이자 IDE로, 부끄러운 C ++ 컴파일러입니다. Visual C ++ 컴파일러의 최신 버전은 무료 (IDE없이) 무료입니다.
strlen은 반환 유형 무효가 아니며, 올바른 메시지를 제공하지 않는 디버거입니다.
왜 당신의 데버거가 무효를 보이는가?
사용중인 strlen의 구현은 아마도 #define strlen someothername_strlen 주위에 포장 될 것입니다.
디버거는 아마도 #Define을 올바르게 지원하지 않거나 기능의 다른 수정자를 지원하지 않을 것입니다.
ilen = strlen ( "테스트")과 같은 작업을 수행 한 다음 시계에서 Ilen을 확인해야합니다.
일반적으로 시계에서 기능을 호출 할 수 있습니다. 예를 들어 다음 기능을 정의한 다음 시계에서 호출하십시오.
int testFunc(char*)
{
return 5;
}
결과적으로 시계에서 5를 얻을 수 있습니다.
Strlen은 정수를 반환하므로 "0"을 반환한다는 것을 의미한다고 가정합니다.
또한 데이터 유형을 지정하는 방법은 Const Char *또는 Const Char **인지 알 수 없습니다. 그것이 후자라면, 당신은 **를 단일 *로 비교하고 있는지 확인해야합니다.
내 생각에 문자열은 널 바이트로 시작하여 0이 되돌아가는 이유입니다.
C ++에서 함수는 항상 반환으로 선언 된 유형의 값을 반환합니다. 이후 strlen
함수 선언은 다음과 같습니다.
size_t strlen(const char *);
그것이 할 수있는 유일한 것 혹시 반환은 a입니다 size_t
. 컴파일러는 컴파일 시간 에이 정보를 사용하여 함수를 호출 할 때 리턴 값을 처리하는 방법을 결정합니다. 여기서 요점은 strlen
기능은 위와 같이 선언되어 있으며 반환을 결정할 수 없습니다. void
때때로 유형의 값 size_t
다른 시간.
이것은 일반적으로 C ++와 같은 정적으로 입력 된 언어의 특징입니다. 동적으로 입력 한 언어 (Perl, Python, Ruby, PHP 등)에서 함수는 호출 할 때마다 모든 유형의 값을 반환하기로 결정할 수 있습니다.
void를 반환 할 수 없습니다. void는 반환 값이 부족하기 때문에, 당신은 그것을 오류, 반환 할 수는 없습니다.
어쨌든 무효를 어떻게 확인합니까? void는 값이 아닙니다. 당신이 어떻게 공허하게되는지 보여주십시오. 컴파일 타임입니까 아니면 런타임입니까?
실제로 시스템이있는 경우 strlen
a로 선언됩니다 void
반환 유형, 다른 방향으로 최대한 빨리 실행하십시오.