NULL 포인터를 할당하는 대신 포인터가 가리키는 메모리의 위치를 NULL로 설정하는 방법이 있습니까? 위치는 NULL이 될 것입니까?pointee를 NULL로 설정하면 해당 주소를 가리키는 포인터가 모두 NULL이됩니다.
답변
아니요. 메모리를 0으로 설정하면 해당 메모리에 대한 포인터에 아무런 영향을 미치지 않습니다. 물론 메모리가 해제 된 후에는 메모리를 제로화 할 수 없습니다.
null 포인터는 메모리 위치를 가리 키지 않음을 나타냅니다. 따라서 메모리 위치를 가리키는 한, 그 메모리 위치에 넣을 수있는 것은 아무것도 없으며, 이는 메모리 위치를 가리킨다는 사실을 변경합니다.
이것은 null 세트와 빈 세트의 차이점입니다. 내가 쿠키 한 병을 비우는 경우, 나는 여전히 쿠키 한 병 (빈 세트)을 가지고 있습니다. null을 가지려면 항아리를 완전히 없애야합니다. 항아리의 내용에 내가하는 일로 항아리가 있다는 사실이 바뀌지 않습니다.
tl; dr : no
포인터는 단지 주소입니다. 주소가 0이면 대부분의 시스템에서 널 포인터입니다. 포인터가 null인지 확인하기 위해 검사 할 때 포인터에 의해 참조 된 주소에 저장된 데이터는 어떤 방식으로도 액세스되지 않습니다. 이 데이터는 포인터가 참조 해제 될 때 메모리에서로드됩니다.
자신의 실수에서 자신을 보호하기보다는 미래에 동일한 실수를 다시하지 않도록 배울 수있는 방법이 있습니까? :-)
NULL에 대한 포인터를 설정하는 등의 모든 일들은 그 뒤에있는 메모리가 해제 될 때나 "안전한"문자열 함수를 사용하는 것과 같이 안전하지 않은 것으로 간주되는 것을 사용할 수 있다고 생각합니다. 그들이하는 일을 아는 사람들의 손에 완벽하게 안전합니다.
내 제안은 사용하고 싶은 언어의 잡화를 배우거나보다 안전하다고 느끼는 언어로 이동하는 것입니다. 당신이 말하는 것은 참조 카운팅 같은 것이고 많은 언어가 있습니다 (Objective-C 스프링이 마음에 듭니다).
그러나 C에서 코드를 작성하려고하거나 을 익히면 어두운면을 포함하여 언어를 익히십시오. 더 나은 코더가 될 것입니다.
: 여담으로, 난 당신이 한 뒤에 메모리를 해제하는 경우, 모든 별명이 자동적으로 NULL로 설정됩니다, 그래서 당신을 위해 무엇을 요구하는지 것은 포인터의 별칭을 추적 할 수있는 방법이라고 생각
char *x = malloc(50);
char *y = x;
free (x);
// Both x and y are now magically set to NULL.
당신은 할당 된 블록에 대한 포인터를 (수동 또는 일부 GCC와 같은 게으른 바인딩 속임수를 사용) 즉, 절편의 malloc에서 C로 간접의 형태를하고 그래서, 대신에 반환하여이 이것을 달성 할 수 , 할당 된 블록에 할당 된 포인터에 대한 포인터를 반환합니다.
free
호출은 블록을 해제하지만 할당 된 포인터 (NULL로 설정 됨)가 아닌 호출을 수정해야합니다.
char **x = mymalloc(50);
char **y = x;
myfree (x);
// Both *x and *y are now magically set to NULL.
그래픽 형태 : 코드 내에서 간접 작업이 두 번 indirections (대신 *x
의 **x
) 될 것
+---+
| x | -+
+---+ | +--------+ +------+
+-> | tmp000 | ---> | data |
+---+ | +--------+ +------+
| y | -+
+---+
당신이 myfree
라고는 data
가 해제 될 수 있지만 tmp000
포인터. x
또는 y
을 사용하여 data
에 도달했는지 여부에 상관없이 NULL로 설정되므로 오류가 발생합니다. 물론
,이 주위에 거짓말 포인터를 떠나는 문제와이 코드를 처음 본 괜찮은 C 코더가 아래로 당신을 추적하고 :-) 펄프로 이길 것이라고 추가 문제가
"포인터 거짓말"문제는 tmp000
의 참조 횟수를 사용하여 해결할 수 있지만 char **y = mydup(x);
과 같이 포인터의 모든 복사본을 추적해야합니다.
"펄프에 맞다"문제는 모든 의도와 목적으로 불용성입니다.
_bloody_ 펄프, 정확하게 말하자면 : 저는 이제 my_free ((void **) & pointer);로 가득 찬 상속 된 코드를보고 있습니다. 그리고 엄격한 플랫폼에서 작동하도록하기 위해서 제 직업입니다. 맹목적으로 역 참조 형식의 포인터를 '안전'의 이름으로 말한 사람들은 (포인터를 잃어 버리기 때문에) lynched됩니다. –
- 1. DataContext를 설정하면 UserControl에서 PropertyChanged가 null이됩니다.
- 2. 포인터가 신비하게 NULL로 재설정됩니다.
- 3. 다른 로컬 포인터에 포인터가 가리키는 주소를 할당하는 방법
- 4. 멤버 함수 포인터가 정수를 가리키는 포인터입니까?
- 5. .h의 포인터가 자동으로 NULL로 설정됩니까?
- 6. 도메인이 가리키는 IP 주소를 변경하십시오.
- 7. 포인터가 배열을 가리키는 지 어떤 방법으로 감지하나요?
- 8. std :: bad_alloc을 throw하면 새 포인터가 NULL로 설정됩니까?
- 9. Safari 3+에서 window.location.hash를 null로 설정하면 #
- 10. 포인터를 NULL로 설정하면 삭제되지 않는 이유는 무엇입니까?
- 11. WPF에서 컨트롤의 ItemSource 속성을 null로 설정하면 메모리 누수가 발생합니까?
- 12. null에 대한 유일한 참조를 설정하면 해당 자식 스레드가 가비지 수집됩니까?
- 13. 포인터가 가리키는 값을 기준으로 이중 포인터 배열을 정렬하는 방법은 무엇입니까?
- 14. gdb를 사용하여 디버깅하는 동안 포인터가 가리키는 문자열을 출력하는 방법은 무엇입니까?
- 15. Delphi 7에서 포인터가 가리키는 유형의 크기를 가져올 수 있습니까?
- 16. 추력/CUDA 경고 해결 "포인터가 가리키는 점을 알 수 없음 ..."
- 17. 포인터가 가리키는 메모리의 크기를 계산하는 방법은 무엇입니까? 하나의 함수에서
- 18. 왜 포인터가 NULL이 아닌가요?
- 19. 최대 절전 모드 계단식 : 부모에서 null로 설정하면 자식을 삭제해야합니까?
- 20. 레일 - 특정 IP 주소를 제외하고 모두 차단합니다.
- 21. PHP 연결이 NULL이됩니다.
- 22. UITableViewController의 TableView가 NULL이됩니다.
- 23. 포인터가 파생 된 유형의 인스턴스를 가리키는 지 어떻게 알 수 있습니까?
- 24. null로 SQL Server 문자열 연결
- 25. 이 상황에서 정확한 주소를 가리키는 방법! 도움이 필요합니다
- 26. ADA 액세스 변수가 가리키는 주소를 인쇄하는 방법은 무엇입니까?
- 27. 포인터가 범위를 벗어날 때를 찾기위한 프로그램 및 기술
- 28. 함수 포인터가 멤버 함수
- 29. 테이블의 빈 문자열 필드를 모두 null로 업데이트하려면 어떻게해야합니까?
- 30. 게시 매개 변수가 null이됩니다 (무작위로)
NULL 포인터를 역 참조 할 수 없다는 사실이 마음에 들지 않으십니까? –