2016-06-28 2 views
1

구조체를 먼저 선언하지 않고 함수에 전달하는 것에 대한 질문이 있습니다.구조체를 이와 같은 함수에 전달

static void DrawArc(struct MATH_POINT *p, other args); 

내가이

struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

같은 구조를 전달할 수 있습니다 알고 있지만 나 또한 이런 식으로 작업을 수행 할 수 있습니다 :

는이 같은 구조체 포인터를받는 함수를

DrawArc(&(struct MATH_POINT){0,0}, other args); 

매우 한정된 레지스터 공간이있는 임베디드 플랫폼과 GUI 재미 때문에이 방법을 사용하고 있습니다. ctions에는 많은 인수가 필요합니다.

그러나 걱정하지 마라. 인자 목록에서 초기화 한 구조가 계속되어 RAM을 사용하게 될 것이다. 이것이 가능한가? 아니면 구조체는 함수가 끝나자 마자 파괴 될 것인가?

감사합니다!

+1

이 질문은 귀하가 사용하는 특정 컴파일러 및 프로세서를 알지 못해서 풀릴 수 없습니다. 또한 최적화 기능을 사용하여 빌드할지 여부를 결정합니다. –

+0

arm-none-eabi를 사용하고 있는데 -O2를 사용하고 있습니다. STM32F767-144 핀을 사용하고 있습니다. –

답변

3

당신은 섞고 ​​일치하는 것들입니다. malloc/calloc/etc로 명시 적으로 인스턴스화되지는 않았지만 로컬로 인스턴스화 된 모든 객체는 힙 메모리를 차지하지 않으므로 변수가 범위를 벗어날 때까지 스택이 커지게됩니다.

첫 번째 예 :

struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

완벽하게 괜찮습니다. point은 스택에 할당되며, 자체 저장에 필요한 메모리보다 많은 메모리를 차지하지 않으며 선언 범위를 벗어날 때 자동으로 해제됩니다.

두 경우 모두 동적 할당이 없으므로 상황을 벗어날 위험이 없습니다. 두 번째는 함수가 반환하는 즉시 폐기되는 동안 처음의 범위는 여전히 DrawArc를 호출 한 후 살아 있기 때문에

+0

답변 해 주셔서 감사합니다! 두 메서드의 코드 크기도 테스트 할 것입니다. 그리고 나는 첫 번째 방법을 고수하고 미래의 사용을 위해 포인트 변수를 유지할 것이라고 생각합니다. –

-1
struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

이 시점의 변수는이

DrawArc(&(struct MATH_POINT){0,0}, other args); 

보다 더 오래 살 것이다. (및 둘 다 "스틱 어라운드"둘 다 잘 정의 된 수명주기를 가지고 있습니다 .-))

변수를 "제거"하고 추가 범위를 추가하고 필요하지 않은 경우 닫으려면 더 이상 :

#define MANY 10000 
{ 
    struct MATH_POINT removeMe[MANY]; 
    /* work on removeMe while they're alive */ 
    doThings(removeMe, other_stuff); 
} 
/* here removeMe is gone, and the mem can/will be used otherwise */ 
+0

'이고 두 번째는 함수가 반환되자 마자 버려집니다. 아니, 기능은 범위를 소개하거나 끝내지 않는다. 복합 리터럴의 유효 기간은 현재 블록 (함수 호출이있는 블록)에서 닫는 괄호까지 지속됩니다. – 2501

+0

erm ... 범위를 벗어나는 함수 매개 변수 (이 함수는 임시 호출 인 경우)가 정확히 언제입니까? 함수가 반환되자 마자. 나는 새로운 범위가 도입되었다고 말하지 않았다. – Tommylee2k

+0

나는 귀하의 견적에 대해 논쟁을 벌였습니다. – 2501