programing

C 포인터 및 배열: [Warning] 할당은 캐스트가 없는 정수에서 포인터를 만듭니다.

lovejava 2023. 10. 21. 09:48

C 포인터 및 배열: [Warning] 할당은 캐스트가 없는 정수에서 포인터를 만듭니다.

C의 포인터와 배열에 문제가 있습니다.코드는 다음과 같습니다.

#include<stdio.h>


int *ap;
int a[5]={41,42,43,44,45};
int x;

int main()
{
    ap = a[4];
    x = *ap;
    printf("%d",x);
    return 0;
}

코드를 컴파일하고 실행하면 다음과 같은 경고가 표시됩니다.

[경고] 할당은 캐스트가 없는 정수에서 포인터를 만듭니다 [기본적으로 활성화].

9번 라인(ap = a[4];)의 경우 단말기가 충돌합니다.9번 라인을 위치를 포함하지 않도록 변경하면(ap = a;) 경고를 받지 않고 작동합니다.왜 이런 일이 생기는 건가요?정답이 뻔하다는 느낌이 들지만 잘 안 보이네요.

이경우a[4]5th배열의 정수a,ap는 정수에 대한 포인터이므로 포인터에 정수를 할당하는 것이며 이는 경고입니다.
그렇게ap지금은 유효합니다.45(함으로써) 참조를 취소하려고 할 때*ap주소 45에 있는 메모리에 액세스하려고 하면 잘못된 주소이므로 프로그램이 충돌합니다.

당신이 해야합니다.ap = &(a[4]);아니면ap = a + 4;

c배열 이름이 포인터로 손상되므로a배열의 첫 번째 요소를 가리킵니다.
이런 식으로.a와 동치입니다.&(a[0]).

무엇을 하고 계십니까? (더 나은 읽기를 위해 in 대신 바이트를 사용하고 있습니다.)

당신은 시작합니다.int *ap컴퓨터의 메모리는 다음과 같습니다.

-------------- memory used by some one else --------
000: ?
001: ?
...
098: ?
099: ?
-------------- your memory  --------
100: something          <- here is *ap
101: 41                 <- here starts a[] 
102: 42
103: 43
104: 44
105: 45
106: something          <- here waits x

(...print ("$d", ...의 바로 가기 인쇄) 다음 경우에 어떤 일이 발생하는지 살펴보겠습니다.

print a[0]  -> 41   //no surprise
print a     -> 101  // because a points to the start of the array
print *a    -> 41   // again the first element of array
print a+1   -> guess? 102
print *(a+1)    -> whats behind 102? 42 (we all love this number)

따라서 a[0]은 *a, a[1] = *(a+1), ...와 같습니다.

a[n] 읽기 편할 뿐입니다.

자, 9호선에서는 어떻게 됩니까?

ap=a[4] // we know a[4]=*(a+4) somehow *105 ==>  45 
// warning! converting int to pointer!
-------------- your memory  --------
100: 45         <- here is *ap now 45

x = *ap;   // wow ap is 45 -> where is 45 pointing to?
-------------- memory used by some one else --------
bang!      // dont touch neighbours garden

따라서 "경고"는 단순히 경고가 아니라 심각한 오류입니다.

int[]그리고.int*int[] 할당(IIRC)을 제외하고는 동일한 방식으로 표현됩니다.

ap는 포인터이므로 주소 45에 무엇이 있는지 모르기 때문에 정수 값을 주는 것은 위험합니다.

액세스를 시도할 때(x = *ap), 주소 45에 액세스하려고 하면 액세스할 수 있는 메모리의 일부가 아닐 수 있으므로 충돌이 발생합니다.

언급URL : https://stackoverflow.com/questions/21858412/c-pointers-and-arrays-warning-assignment-makes-pointer-from-integer-without-a