programing

공극 포인터 역참조

css3 2023. 9. 7. 21:55

공극 포인터 역참조

Void 포인터를 캐스팅한 후에도 재참조를 하다가 컴파일 오류가 발생합니다.누구든지 이것의 이유를 제게 알려주실 수 있나요?

int lVNum = 2;
void *lVptr;
lVptr = (int*)&lVNum;

printf("\nlVptr[60 ] is  %d \n",lVptr[1]);

회피 포인터를 삭제하는 것은 말이 안 됩니다.컴파일러는 포인터가 가리키는 메모리를 어떻게 해석합니까?먼저 포인터를 적절한 유형으로 캐스팅해야 합니다.

int x = *(int*)lVptr;

printf("\nlVptr[60 ] is %d \n", *(int*)lVptr);

이렇게 하면 빈 포인터가 다음의 포인터로 캐스팅됩니다.int정확하게 참조를 취소할 수 있습니다.

만약 당신이 그것을 배열로 취급하고 싶다면, 당신은 약간 추한 행동을 할 수 있습니다.((int *)lVptr)[0].사용.[1]범위를 벗어났기 때문에 좋은 생각이 아닙니다.lVptr[60]...)

아직은.void*그렇게 선언하셨으니까요임의의 포인터는 암시적으로 a로 변환될 수 있습니다.void*, 그래서 그 출연진은 아무것도 하지 않고 당신은 그에게 지시할 수 밖에 없습니다.void당신이 처음부터 그랬던 것처럼

당신은 그것을 다음과 같이 선언할 필요가 있을 것입니다.int*.

void *some_ptr = /* whatever */;
int *p = (int*)some_ptr;
// now you have a pointer to int cast from a pointer to void

주의할 점은 캐스팅이int*또한 불필요합니다. 같은 이유로 반환 값을 주조할 필요가 없습니다(그리고 하지 않아야 함).malloc주식회사.

void*은 다른 포인터 유형으로 암시적으로 변환하거나 변환할 수 있습니다.나는 단지 명확한 설명을 위해 여기에 배역을 추가했습니다. 당신은 당신의 코드에 간단히 적을 것입니다.

int *p = some_void_ptr;

또한, 이 내용:

lVptr[1]

틀렸습니다.당신은 하나를 가리키는 포인터를 가지고 있습니다.int, 둘이 아닙니다.이 참조 해제로 인해 정의되지 않은 동작이 발생합니다.

유형이 없으므로 공백 포인터를 참조할 수 없습니다. 먼저 해당 포인터를 캐스트해야 합니다.(int *)lVptr, 그런 다음 그것을 삭제합니다.*(int *)lVptr.

int lVNum = 2;
void *lVptr;
lVptr = &lVNum;

printf("\nlVptr[60 ] is  %d \n",*(int *)lVptr);

수행하려는 작업의 예:

#include <stdio.h>

int main () {
    void *v;
    unsigned long int *i = (unsigned long int *)v;

    *i = 5933016743776703571;

    size_t j = sizeof(i);
    printf("There are %ld bytes in v\n", j);

    size_t k;
    for (k = 0; k < j; k++) {
        printf("Byte %ld of v: %c\n", k, ((char *)v)[k]);
    }
}

출력:

There are 8 bytes in v
Byte 0 of v: S
Byte 1 of v: T
Byte 2 of v: A
Byte 3 of v: C
Byte 4 of v: K
Byte 5 of v: O
Byte 6 of v: V
Byte 7 of v: R

Void 포인터는 Void에 대한 포인터(정의할 수 없음)일 뿐입니다.

일부 경우 유용합니다.예를 들어 malloc()는 UNDEFINED 목적으로 메모리를 할당했기 때문에 void 포인터를 정확하게 반환합니다.일부 함수는 위치 이외의 실제 내용을 신경 쓰지 않기 때문에 무효 포인터를 인수로 사용할 수도 있습니다.

솔직히 말해서, 당신이 올린 토막글은 전혀 말이 안 돼요, 당신이 무엇을 하려고 했는지 짐작조차 할 수가 없어요.

@ 코드-구루 저는 그것을 비주얼 스튜디오에서 편집하려고 했습니다.이것은 오류를 제공합니다 - 표현식은 개체를 완성하는 포인터여야 합니다.

감사합니다 tepic, 당신이 제안한 것처럼, 다음은 올바른 결과를 컴파일하고 산출합니다.

#include<stdio.h>

void main(){

printf("study void pointers \n");

int lvnum = 2;
void *lvptr;
lvptr = &lvnum;
printf("\n lvptr is %d\n",((int *)lvptr)[0]);


}

그러나 printf("\nlvptr is %d\n", (int *)lVptr)[60])를 시도하면,컴파일하고 실행하지만 임의의 숫자를 제공합니다.

친구들, 모든 제안에 감사드립니다.불필요하게 주조된 int 포인터에 void 포인터를 할당하여 참조가 취소될 것으로 예상하여 죄송합니다.하지만 제가 참고를 줄이고 싶을 때 캐스팅을 했어야 합니다.

토막글의 목적:저의 자료에 의하면 비슷한 상황으로 인한 클락워크 오류가 발견되었습니다.반대로 프로그램은 컴파일을 했을 뿐만 아니라 정확한 결과를 주었습니다.이유 - void pointer에 할당된 메모리가 약 60까지 이미 예약되어 있는 로우 레벨 코드(OS 없음)입니다.그러나 clocwork tool에서 해당 제한을 가지는 파일을 구문 분석할 수 없어 오류가 발생했습니다.제가 브레인스토밍을 많이 했는데 결국 바보 같은 짓을 하게 됐습니다.

사우라브

언급URL : https://stackoverflow.com/questions/15468441/dereference-void-pointer