2013-02-05 2 views
1

일부 코드로 내 질문을 지원할 수 없다는 것을 유감스럽게 생각합니다. (어떻게 받아 들일 수 있는지 이해하지 못했지만) 어쨌든 시도합니다.포인터 스택

올바르게 이해하면 동일한 유형의 구조체를 참조하는 구조체는 참조를 위해 포함 된 포인터로이를 수행해야합니다. 이 포인터가 조각화 오류를 만들지 않고 스택의 할당 된 공간 (힙 대신)을 참조 할 수 있습니까? -

어떻게 신고해야합니까?

+0

선언 할 때 특별한 것은 없습니다. 포인터가 스택, 힙 또는 NULL을 가리킬 지 여부는 포인터를 포함하는 구조가 선언되는 방법에 영향을 미치지 않습니다. –

답변

0

예,하지만 그 스택 프레임을 제공하는 방법은 반환하지 않은 경우에만 스택에 변수에 대한 포인터를 사용할 수 있습니다. 예를 들어이 작동합니다 : 이것은 스택 프레임으로, 그러나 오류가 발생합니다

typedef struct 
{ 
    int a; 
    float b; 
} s; 

void printStruct(const s *s) 
{ 
    printf("a=%d, b=%f\n", s->a, s->b); 
} 

void test() 
{ 
    s s; 
    s.a = 12; 
    s.b = 34.5f; 
    printStruct(&s); 
} 

이 사라진 것 :

s *bad() 
{ 
    s s; 
    s.a = 12; 
    s.b = 34.5f; 
    return &s; 
} 

편집 : 그럼 난이 오류가 발생합니다 말하지만, 동안

: 내가 컴파일시 경고가

int main() 
{ 
    test(); 
    s *s = bad(); 
    printStruct(s); 
    return 0; 
} 

:와 그 코드를 호출

$ ./s 
a=12, b=34.500000 
a=12, b=34.500000 

를하지만 사실, 깨진 :

s.c:27:5: warning: function returns address of local variable [enabled by default] 

프로그램이 잘 작동이 나타납니다.

+0

답변 해 주셔서 감사합니다. 나는 그것이 왜 깨져야 하는지를 믿는다. 그러나 그것이 여전히 효과가있는 이유는 무엇인가? – stian

+0

함수가 반환되고 이전에 있었던 모든 것이 여전히 유효하기 때문에 스택이 * 재사용되지 않기 때문에 가능성이 높습니다. 그 사이에 다른 함수 (스택 변수 포함)가 호출되면 확실히 실패합니다. – trojanfoe

0
은 ... 다음 코드는 완벽하게 유효한 당신은 그래서 당신의 질문의 표현에서 지금은 C를 가정에서 작업하는 어떤 언어로 말하지 않았다입니다

:이 예에서는

typedef struct str_t_tag { 
    int foo; 
    int bar; 
    struct str_t_tag *pNext; 
} str_t; 

str_t str1; 
str_t str2; 
str1.pNext = &str2; 

str1이 모두와 str2가 스택에 있지만, 둘 중 하나 또는 모두가 힙에있는 경우에도 작동합니다. 당신이주의해야 할 유일한 것은 스택 변수가 범위를 벗어날 때 압축 될 것이라는 것입니다. 따라서 str1을 동적으로 할당하고 함수에서 다시 전달하면 str1 -> pNext가 가리키는 것을 원하지 않을 것입니다 그 함수 내에서 스택에 있던 것.

즉,이 작업을 수행하지 마십시오 :

typedef struct str_t_tag { 
    int foo; 
    int bar; 
    struct str_t_tag *pNext; 
} str_t; 

str_t *func(void) 
{ 
    str_t *pStr1 = malloc(sizeof(*pStr1)); 
    str_t str2; 
    pStr1->pNext = &str2; 

    return pStr1; /* NO!! pStr1->pNext will point to invalid memory after this */ 
} 
+0

'pStr1'이 초기화되지 않은 경우'sizeof (* pStr1)'이 작동합니다 ('malloc' 라인을 처리 할 때처럼)? – Dukeling

+0

예 - sizeof는 컴파일 할 때 계산되므로 내용을 초기화하여 크기가 얼마나 큰지 알 필요가 없습니다. – Vicky

0

이것이 구체적으로 C/C++ 질문 일 경우 확실하지 않지만 어쨌든 C/C++ 코드를 예제로 제공하겠습니다.

유일한 방법 당신은 그것을 선언 할 수 있습니다 : (약간의 변화와 함께) 다음과 같이

typedef struct abc 
{ 
    struct abc *other; 
} abc; 

other가 스택에 객체를 가리킬 수 있습니다 :

abc a, b; // stack objects 
b.other = &a; 

이이 범위에 대한 질문이 아니다 , 위의 작업을 수행 할 때 발생할 수있는 문제에 대해서는 언급하지 않겠습니다.

그러나 동적으로 생성 된 개체에 할당하려는 경우이 개체를 스택에 저장할 수있는 방법이 없습니다.

abc b; 
b.other = malloc(sizeof(abc)); // on the heap 
+0

위대하고 정교한 대답 : – stian

+1

@dexter,이 답변이나 다른 답변이 도움이 되었다면, 답안의 왼쪽에있는 위쪽 화살표를 사용하여 upvote하고/또는 그것을 수락하십시오. 대답의 왼쪽). – Vicky

+0

@vicky, obs, 미안. – stian

관련 문제