2014-03-06 4 views
1

로컬 변수를 만드는 방법이 정의되지 않은 동작인지 확실하지 않습니다.정의 된 방식으로 로컬 변수를 사용합니까?

N과 L은 모두 임시 스택 주소에 대한 포인터를 보유합니다. 이거 안전한가요? 컴파일러는 스택 주소에 대한 포인터를 사용하고 다른 로컬 변수와 같은 다른 주소로 덮어 쓰는 것을 잊어 버릴까요? 일단 함수의 범위가 끝나면 안전하지 않습니다. 그러나 나는 아래 예제에 대해 확신 할 수 없다. 모든 통찰력을 많이 주시면 감사하겠습니다. 시간 내 주셔서 감사합니다.

struct Node { /* ... */ }; 

struct Node* 
Node_setNode(struct Node* node) 
{ 
    /* ... */ 
    return node; 
} 

struct List { /* ... */ }; 

void 
List_push(struct List* list, struct Node* node) 
{ 
    /* ... */ 
    list->next = node; 
} 


int main() 
{ 

    struct Node* N = Node_setNode((& ((struct Node){ 0 }))); 
    struct List L; 
    List_push(&L, (& ((struct Node){ 0 }))); 

    return 0; 
} 
+0

안전하지 않은'(struct Node) {0} '에 대한 포인터를 가져 오는 것이 좋습니다. 나는 그것이 왜 전혀 컴파일되지 않는지 잘 모르겠다. 그래서 어쩌면 나는 뭔가를 놓친다. – user2357112

+0

@ user2357112'(struct Node) {0}'의 효과는'struct Node tmp = {0}; '을 선언하는 것과 같지만 로컬 변수의 이름은 지정하지 않습니다. 스택에 공간이 생깁니다. 나는 그것을 읽는 것이 어렵다. 그래서 나는 그것을 추천하지 않을 것이지만 그것은 효과적이다. – Luke

답변

3

스택의 전체 지점은 그 위에 물건을 밀어 넣을 수 있다는 것입니다.

다른 함수를 호출하면 main()의 하위 스택 프레임에 영향을주지 않고 로컬 변수를 사용하여 새 스택 프레임을 푸시합니다.

함수에서 선언 된 변수는 반환 될 때까지 스택에 남아 있습니다.

+0

네, 이해합니다. 포인터를 사용하여 동일한 방식으로 스택 프레임의 다른 로컬 변수에 의해 덮어 쓰지 않는 방법으로 주소를 스택하는 경우 이해하려고합니다. –

+0

@ joe.ds : 컴파일러는 여전히 범위에있는 변수의 주소를 덮어 쓰지 않습니다. – SLaks

2

아니요, 컴파일러는 로컬 변수를 잊지 않습니다. 당신이 그들을 사용하는 방식은 안전하고 좋습니다.

스택의 무언가에 대한 포인터를 절대 돌려 보내지 않았 으면 좋을 것입니다.

관련 문제