문제

다음은 오랫동안 (범위 측면에서) 불분명 한 특정 시나리오입니다.

코드를 고려하십시오

#include <stdio.h>


typedef struct _t_t{
    int x;
    int y;
} t_t;

typedef struct _s_t{
    int a;
    int b;
    t_t t;
}s_t;

void test(s_t & s){
    t_t x = {502, 100};
    s.t = x;
}


int main(){
    s_t s; 
    test(s);

    printf("value is %d, %d\n", s.t.x, s.t.y);
    return 0;
}

출력은입니다

value is 502, 100

나에게 약간 혼란스러운 것은 다음과 같습니다. 선언

t_t x

함수 테스트의 범위에서 선언됩니다. C 프로그래밍에 관해 읽은 내용에서는이 범위에서 쓰레기가되어야합니다. 그러나 올바른 결과를 반환합니다. ST = X 라인의 "="이기 때문입니다. x의 값을 st로 복사합니까?

편집하다---

실험 후

#include <stdio.h>


typedef struct _t_t{
    int x;
    int y;
} t_t;

typedef struct _s_t{
    int a;
    int b;
    t_t t;
}s_t;

void test(s_t & s){
    t_t x = {502, 100};
    t_t * pt = &(s.t);
    pt = &x;
}


int main(){
    s_t s; 
    test(s);

    printf("value is %d, %d\n", s.t.x, s.t.y);
    return 0;
}

실제로 출력

value is 134513915, 7446516

예상대로.

도움이 되었습니까?

해결책

ST = X 라인의 "="이기 때문입니다. x의 값을 st로 복사합니까?

예.

그건 그렇고, 이것은 C ++입니다. 함수에 대한 참조로 "S"로컬을 메인으로 통과 시켰으며,이를 수정합니다. 사본이 아닌 참조이기 때문에 발신자의 "S"에 영향을 미칩니다.

다른 팁

   t_t x = {502, 100};
   s.t = x;

첫 번째 테스트에서, 당신은 컴파일러를 지시하고 있습니다 복사 의 가치 x ~ 안으로 s.t - 이것은 예상대로 작동합니다. 로컬 변수 x 범위를 벗어나지 만 기능 외부에서는 참조되지 않습니다. 처음에 포함 된 데이터는 t 의 멤버이다 main()의 로컬 변수 s. 대신 다음을 썼다면 효과적으로 동일합니다.

t_t x = {502, 100};
s.t.x = x.x;
s.t.y = x.y;

두 번째 테스트에서, 당신은 다른 포인터에 포인터를 할당하며, 둘 다 로컬 변수로 선언됩니다. 이것은 유용하지 않습니다 s.t 비 초기화 된 상태로 남아 있습니다. 나는 당신이 그것을 따르는 데 도움이되는 코드에 주석을 달았습니다.

t_t x = {502, 100}; // local variable x initialized with 502, 100
t_t * pt = &(s.t); // local variable pt initialized with ADDRESS OF s.t
pt = &x; // local variable pt re-assigned to hold address of local variable x

// local variables go out of scope, output parameter s remains unmodified

이것을 읽으십시오 : 기본 카피-구성 요소 및 할당 연산자

과제 연산자를 제공하지 않으면 구조 _S_T는 할당 될 때 모든 회원의 얕은 코피를 수행합니다. _T_T에 모든 것을 값으로 저장하고 있기 때문에 모든 데이터는 값으로 복사됩니다.

당신이 설명하는 문제는 _t_t가 데이터에 대한 포인터를 보유 할 때입니다.

경우에:

typedef struct _s_t{
        int a;
        int b;
        t_t* t;
}s_t;

void test(s_t & s){
        t_t x = {502, 100};
        s.t = &x;
}

Test ()의 끝에서 t_t가 파괴 될 때,이 시점에서 포인터는 유효하지 않을 것이므로 문제가 발생합니다.

ETA : 질문에 더 많은 것을 추가했기 때문에 ...

void test(s_t & s){
     t_t x = {502, 100};
     t_t * pt = &(s.t);
     pt = &x;
}

여기서 다른 문제를 만들었습니다. 그곳에서 일어난 일은 ST 주소에 대한 포인터를 만들었습니다. 괜찮습니다. 그러나 당신은 X를 가리키기 위해 포인터를 재 할당했습니다 (이 과제, ST에 아무것도하지 않았습니다. 포인터 PT가 가리키는 것을 바꾸고 있습니다) 출력이 '예상대로'이라는 이유는 이체화되지 않은 상태를 읽고 있기 때문입니다. 구조물.

당신 말이 맞아요, 라인

s.t = x;

값을 복사합니다.

Asignment는 한 변수에서 다른 변수로 값을 복사합니다. 따라서 원래 로컬 X가 사라졌지 만 S에 사본이 있습니다.

x에 대한 포인터를 방금 할당했을 때 매우 다릅니다.

typedef struct _s_t{
        int a;
        int b;
        t_t* t;
}s_t;

void test(s_t & s){
        t_t x = {502, 100};
        s.t = &x;
}

그러면 문제가있을 것입니다. X의 주소 만 있지만 X는 사라졌습니다. 따라서 유효하지 않은 메모리 위치를 효과적으로 참조 할 수 있습니다. 이 프로그램의 행동은 정의되지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top