programing

C 질문: (공백 *) vs (공백 *)

megabox 2023. 9. 16. 08:54
반응형

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

반응형