'for' 루프 이니셜라이저에서 포인터를 역참조하면 분할 오류가 생성됩니다.
의 포인터를 사용하는 데 문제가 있습니다.for
루프. 내 안에서.for
루프 이니셜라이저, 참조 취소int
포인터를 지정하고 값을 '0'으로 지정합니다.루프에서 참조되지 않은 포인터를 사용하면 분할 오류가 발생하는데, 그 이유를 이해할 수 없습니다.사용 중인 코드::블록과 CGNU GCC 컴파일러.
시계 창문을 보면, 나는 그것을 볼 수 있습니다.
for
루프 변수에 난수가 있습니다.참조되지 않은 포인터가 다음 작업 중에 범위를 잃는 것 같습니다.
for
고리.
코드:
#include <stdio.h>
int main(void)
{
int val = 0;
int *p = NULL;
int answer = 0;
p = &val;
*p = 1; // This dereferences and sets to one successfully
for (int i=3, (*p)=0 ; i>=0; i--) // Here *p is a random number
{
printf("do stuff");
(*p) += 1; // Here it causes a segmentation fault
}
answer = *p;
}
저는 제 방식대로 포인터를 사용하는 데 문제가 없을 것이라고 생각했습니다.
여기서 자세히 살펴보십시오.
for (int i=3, (*p)=0 ; i>=0; i--)
의 첫 번째 부분에서.for
이름이 지정된 새 포인터 변수를 정의하는 중입니다.p
그림자를 드리우는p
이전에 정의하고 NULL로 초기화합니다.그런 다음 세그먼트 결함을 유발하는 루프의 NULL 포인터를 참조 해제합니다.
이렇게 기존 변수에 대한 변수 정의와 할당을 함께 가질 수 없으므로 할당을 이동합니다.*p
루프 앞으로:
*p = 0;
for (int i=3; i>=0; i--)
또는 정의할 수 있습니다.i
루프 외부:
int i;
for (i=3, (*p)=0 ; i>=0; i--)
쉼표 연산자를 사용하여 다음과 같이 압축할 수 있습니다.
for (int i=(*p=0,3) ; i>=0; i--)
다음에 대한 할당p
의 이니셜라이저의 일부로 발생합니다.i
새로운 변수를 선언하지 않습니다.하지만 이것은 당신의 코드를 읽고 이해하는 것을 더 어렵게 만들기 때문에 추천하지 않을 것입니다.
다음과 같은 완전히 새로운 변수를 선언합니다.p
:
for (int i=3, (*p)=0 ; i>=0; i--)
이는 다음과 같습니다.
for (int i=3, *p=0 ; i>=0; i--)
그래서 당신은 그것을 만들고 있습니다.int i
그리고int *p
주소 0을 가리킵니다.이것은 같지 않습니다.p
앞서 정의한 바와 같이.그림자만 드리울 뿐입니다.그래서 당신이 그것을 더 이상 언급하지 않을 때, 당신은 세그먼트 결함을 갖게 됩니다.
팁: 사용-Wshadow
변수가 다른 변수에 그림자를 드리울 때 경고를 받습니다.
[] $ gcc main.c -Wshadow
main.c: In function ‘main’:
main.c:13:21: warning: declaration of ‘p’ shadows a previous local [-Wshadow]
13 | for (int i=3, (*p)=0 ; i>=0; i--) // Here *p is a random number
| ^
main.c:6:10: note: shadowed declaration is here
6 | int *p = NULL;
| ^
https://coliru.stacked-crooked.com/a/5de37f53cf0b094d
언급URL : https://stackoverflow.com/questions/57431196/dereferencing-a-pointer-in-a-for-loop-initializer-creates-a-segmentation-fault
'programing' 카테고리의 다른 글
Apache POI를 사용하여 Excel 차트 생성 (0) | 2023.07.13 |
---|---|
' 상태를 확인하기 위한 Oracle 빈 상태 (0) | 2023.07.13 |
클래스 로더 오류 - 로더 org.springframework.boot.devtools.restart.classloader의 명명되지 않은 모듈입니다.클래스 로더 다시 시작 (0) | 2023.07.13 |
Oracle 데이터베이스에 오는 모든 쿼리 표시 (0) | 2023.07.13 |
Firebase 프로젝트의 지원 이메일을 변경하려면 어떻게 해야 합니까? (0) | 2023.07.13 |