2012-04-26 3 views
10

제목은 내 문자 포인터가 NULL을 가리키고, 또는 그냥 0포인터가 NULL을 가리키는 지 어떻게 확인합니까?

그래서 크기의 문자 배열을 가리키는 않다면 잘 모르겠어요해서 ... 잘못된 이름의 약간있을 수 있습니다 가

char* data = getenv("QUERY_STRING"); 

데이터가 null인지 (또는 길이가 <인지) 확인하고 싶습니다. 나는 시도했다 :

if(strlen(data)<1) 

하지만 오류 얻을 : 나는 또한

if(data == NULL) 

하지만 같은 결과

을 시도했습니다

==24945== Invalid read of size 1 
==24945== at 0x8048BF9: main (in /cpp.cgi) 
==24945== Address 0x1 is not stack'd, malloc'd or (recently) free'd 

합니다.

여기 무슨 일 이니? 이미 데이터를 가지고 시도해 봤는데 잘 작동합니다. null이거나 비어 있는지 확인할 수없는 것 같습니다.

나는 이것이 서로 다른 두 가지 (null과 empty)라는 것을 알고 있습니다. 어떤 데이터가 여기에 있는지, 그리고 null/empty인지 확인하는 방법을 알고 싶습니다.

+2

사이드 노트 :'char *'가 아닌'const char *'를 사용해야합니다. [(C++) docs] (http://www.cplusplus.com/reference/clibrary/cstdlib/getenv/) :'이 함수가 반환 한 포인터가 가리키는 문자열은 프로그램에 의해 수정되지 않아야합니다. ' – Cameron

답변

21

getenv를 사용하면 두 경우를 모두 처리해야합니다. (예!) 환경 변수가 설정되지 않은 경우 함수는 NULL을 반환합니다. 값이 설정되면 값이 설정된 값으로 포인터가 생깁니다. 값은 비어있을 수 있습니다. 그래서 : - 위 if의 두 가지 조건이를 주문하는 이유는

const char* data = getenv("QUERY_STRING"); 
if (data != NULL && data[0] != '\0') { 
    // Variable is set to value with length > 0 
    // ... 
} 

물론, 당신은 의 길이를 결정하거나 가리키는 문자를 읽는 전에 NULL인지 확인해야 그들은 그렇습니다.

+3

이것은 크게'if (data && * data) {...}'로 줄일 수 있습니다. – Philip

+5

@Philip : 예, 가능합니다. 그러나 어느 것이 더 읽기 쉽습니까? 그것은 의견의 문제입니다. 가장 좋아하는 것을 사용하십시오! 내 개인적인 취향은'if (data && data [0]! = '\ 0')'입니다. 내 대답을 명확하게하기 위해'! = NULL'을 추가했습니다. – Cameron

+0

@ 카메론 : 그래서 어떤 사람들은 NULL! = 0 인 플랫폼이 있다고 주장합니다. 반면에 "0 값, 널 포인터 값 또는 널 포인터 값은 거짓으로 변환됩니다."*. 이는 두 가지 검사 방법 모두 유효 함을 의미합니다. – SigTerm

4

일반적으로 다음과 같이 확인하십시오. 첫 번째 부분은 포인터가 null인지 검사하고, 두 번째 부분은 모든 문자열의 끝에서 널 종결 자의 첫 번째 문자를 검사하여 빈 문자열을 확인합니다.

if (data == NULL || data[0] == 0) 

귀하의 문제는 표준되지 않습니다 getenvstrlen 사이에 특정 상호 작용처럼 보인다.

+0

'getenv'는 일반적인 null-terminated C-string에 대한 포인터를 반환합니다. 'strlen'은 이런 종류의 문자열을 위해 만들어졌습니다. – Cameron

+0

@Cameron :'\ 0'으로 시작하지 않는 길이가 0 인 C- 문자열을 상상할 수 있습니까? – SigTerm

+0

@SigTerm : 아니요? – Cameron

관련 문제