이러한 함수는 매달린 포인터를 생성합니까?이것이 매달린 포인터를 생성합니까?
int *foo() {
int a[2] = {2, 3};
int *p = NULL;
p = a;
return p;
}
이러한 함수는 매달린 포인터를 생성합니까?이것이 매달린 포인터를 생성합니까?
int *foo() {
int a[2] = {2, 3};
int *p = NULL;
p = a;
return p;
}
예. 자동 저장 기간이있는 배열에 대한 포인터를 반환하고 있습니다. 함수가 리턴 할 때 포인터는 유효하지 않습니다.
로컬 변수에 대한 포인터를 반환하지 마십시오.
변수 a
이없는 경우 foo
이 반환되므로 포인터가 유효하지 않으므로 (정의되지 않은 동작이 호출됩니다).
기술적으로 반환 된 포인터 (p)는 아마도 스택으로 사용중인 메모리 위치를 가리킬 것입니다. 그러나 반환 된 포인터를 보게 될 때까지는 다른 메모리가 해당 메모리 위치를 덮어 쓰지 않았다는 보장은 없습니다. segfault 또는 다른 잘못된 포인터 오류가 발생하지 않더라도 아무 것도 유용하지 않음을 나타낼 수는 없습니다. –
그렇습니다. 왜냐하면'foo'가 종료 될 때'a'를 (스택 상에) 보유한 메모리는 C 호출 시퀀스의 스택 관리 덕분에 할당이 해제되기 때문입니다. – lurker