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
'programing' 카테고리의 다른 글
XAMPP 및 워드프레스 - 느린 로딩 (0) | 2023.10.21 |
---|---|
electron - node.js - ng : 파일 경로\ng.ps1이 이 시스템에서 실행 중인 스크립트가 사용되지 않도록 설정되어 있으므로 로드할 수 없습니다. (0) | 2023.10.21 |
각도 사용범위 변수를 변경하지 않고 입력 필드의 형식을 지정하는 JS 지시문 (0) | 2023.10.21 |
PHP에서 SSH를 통해 MySQL 서버에 연결 (0) | 2023.10.21 |
URI에서 비트맵을 가져오는 방법? (0) | 2023.10.16 |