programing

'for' 루프 이니셜라이저에서 포인터를 역참조하면 분할 오류가 생성됩니다.

megabox 2023. 7. 13. 20:47
반응형

'for' 루프 이니셜라이저에서 포인터를 역참조하면 분할 오류가 생성됩니다.

의 포인터를 사용하는 데 문제가 있습니다.for루프. 내 안에서.for루프 이니셜라이저, 참조 취소int포인터를 지정하고 값을 '0'으로 지정합니다.루프에서 참조되지 않은 포인터를 사용하면 분할 오류가 발생하는데, 그 이유를 이해할 수 없습니다.사용 인 코드::블록과 CGNU GCC 컴파일러.

  1. 시계 창문을 보면, 나는 그것을 볼 수 있습니다.for루프 변수에 난수가 있습니다.

  2. 참조되지 않은 포인터가 다음 작업 중에 범위를 잃는 것 같습니다.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

반응형