C 질문: (공백 *) vs (공백 *)
다른 점이 뭐죠?const void *
그리고.void *
? 어떤 상황에서 포인터가 A에 캐스팅되는 것을 피할 수 있습니까?const void
포인터?
A const void *
수정해서는 안 되는 메모리를 가리킵니다.
A void *
(non-const) 수정할 수 있는 메모리를 가리킵니다(그러나 를 통해서는 아님).void *
; 먼저 캐스팅을 해주셔야 할 것 같습니다.
사용할때memmove()
, 소스 주소는 다음으로 캐스트됩니다.const void *
:
void *memmove(void *dst, const void *src, size_t nbytes);
이는 빈 공간 포인터를 일정한 빈 공간 포인터로 캐스트할 수 있는 예입니다.기본적으로 포인터가 가리키는 메모리를 수정하지 않을 것이라는 것을 알고 있을 때 언제든지 이를 수행(상수로 변환)할 수 있습니다.이는 무효 포인터뿐만 아니라 어떤 포인터에도 적용됩니다.
(일정한 포인터에서 일정하지 않은 포인터로) 반대로 변환하는 것은 훨씬 더 위험한 연습입니다.예를 들어 문자열 리터럴은 읽기 전용(상수) 메모리에 저장될 수 있으며, 캐스트와의 일관성을 잃고 문자열을 수정하려고 하면 프로그램이 갑자기 중단되고 제어할 수 없게 됩니다.이것은 좋은 일이 아닙니다.따라서 컴파일러에 거짓말을 해도 괜찮은지 확신하지 않고 포인터를 상수에서 상수가 아닌 것으로 변경하지 마십시오.컴파일러들은 거짓말을 당하는 것을 좋아하지 않으며, 보통 가장 불편한 순간에 자신의 프로그램을 돌려받을 수 있습니다(예를 들어 상사, 상사, 상사 앞에서 중요한 잠재 고객에게 프로그램을 시연할 때).).
저희가 한 번에 한 번에 한 번에 한 번에 한 번에 한 번에 한 번에.void *
에 이르기까지const void *
그리고 컴파일러는 당신의 입장에서 아무런 생각 없이 뒤에서 암묵적으로 그렇게 해야 하지만, 그 반대는 위험하므로 피해야 합니다.
기억하세요, 만약 함수가 다음과 같이const
포인터, 그러면 당신은 자유롭게 그것을 전달할 수 있습니다.const
또는 비(非).const
가치. 당신이 A를 가져간다고 말하면서.const
포인터는 당신이 당신의 기능에 의해 메모리가 수정되지 않을 것이라고 선언하는 것일 뿐입니다.
예: (DANGER로 표시된 줄은 컴파일러 오류를 발생시킵니다.)
const void *p_const;
void *p_buffer;
// const pointers are allowed to hold static memory
p_const = "Foo"; // allowed
p_buffer = "Foo"; // DANGER!!!
// casting to const is implicit
p_const = malloc(LEN); // allowed - implicit cast
p_buffer = malloc(LEN); // allowed
// casting to const implicit again
write(STDOUT, p_const, LEN); // allowed
write(STDOUT, p_buffer, LEN); // also allowed - implicit cast
// const memory cannot be used where mutable memory is expected
read(0, p_buffer, LEN); // allowed
read(0, p_const, LEN); // DANGER!!
// To make the above more obivous, we'll skip the intermediate variable
// and place instead what it holds
read(0, malloc(LEN), LEN); // allowed - useless but at least no crashes
read(0, "foo", 4); // DANGER!!!
일반적으로 사용자가 작성한 함수가 수정하지 않을 값의 포인터를 가져오면 함수 서명은 다음을 사용해야 합니다.const
포인팅합니다.용용터'dt지ng은으로 선언되지 않은 포인터 사용const
당신이 가리키고 있는 메모리를 수정할 수 있음을 의미합니다.
또 다른 예:
void do_something(const void* ptr, int length);
// Since the signature is a const pointer, I know I can call it like this:
do_something("foo",4);
반대로 함수는 일정하지 않은 포인터를 호출하고, 그러면 다음을 허용해야 합니다.
void do_something(void* ptr, int length);
// This tells me that the function may overwrite my value.
// The safe solution therefore looks more like this:
char *myptr = char[4];
memcpy(myptr,"foo",4);
do_something(myptr,4);
마찬가지로, 만약 당신이 당신이 캐스팅을 해야 하는 상황에 놓이게 된다면,const
비(非)-를 가리키는 포인터const
첫째, 메모리의 가변 가능한 부분에 포인트 투 값을 복제하고 원본이 아닌 함수에 복제를 전달해야 합니다.그게 두통처럼 들린다면, 그것은 그것이기 때문입니다.만약 당신이 그런 상황에 처해있다는 것을 알게 된다면, 당신은 아마도 뭔가 잘못했을 것입니다.
으로, 가 " "을 " 는 " 과 " 하고 " " " " " " " 과 " " 는 " " " " "일 가능성이 높습니다.const
포인팅합니다.그에 "를 은 비(非) '버퍼',건-const
포인팅합니다.
함수 서명의 포인터는 항상 선언되어야 합니다.const
당신이 그 기억에 편지를 쓸 생각이 아니라면요.이 규칙을 따르는 것은 프로그램 논리의 재앙적인 문제를 방지하는 데 도움이 될 것입니다.
저는 6년 동안 프로그래밍을 할 때까지 이 간단한 규칙을 이해하지 못했습니다.
언급URL : https://stackoverflow.com/questions/5547131/c-question-const-void-vs-void
'programing' 카테고리의 다른 글
추상 클래스가 컨트롤러의 작업에서 매개 변수가 될 수 있습니까? (0) | 2023.09.16 |
---|---|
PL/SQL에 MD5 Sum 기능이 있습니까? (0) | 2023.09.16 |
여러 비동기 작업을 동시에 실행할 수 있습니까? (0) | 2023.09.16 |
MySQL "IN" 쿼리는 하위 쿼리에서는 매우 느리지만 명시적 값에서는 빠릅니다. (0) | 2023.09.16 |
ctype을 사용하여 python 문자열 개체를 char*로 변환 (0) | 2023.09.16 |