2014-11-12 2 views
5

동적으로 할당 된 구조체 배열이 있습니다. 이 배열에 대한 포인터는 다른 함수로 전달됩니다.배열의 -1 요소에 대한 액세스

struct body{ 
    char* name; 
    double mass; 
    // ... some more stuff 
    }; 

body *bodies = malloc(Number_of_bodies*sizeof(body)); 

는 I 배열의 크기를 알아야하므로 I는 배열 (제 구조체)의 0 번째 요소 인 구조체 중 하나의 크기를 저장하고있다.

bodies[0].mass = (double)Number_of_bodies; 

그때 내가 다른 함수에서이 포인터를 사용하면 이제, 데이터가 0 번째 요소에서 시작한다 bodies[1]

return (bodies+1); 

즉 배열의 첫 번째 요소에 함수에서 포인터를 반환 .

body *new_bodies = (bodies+1);  //Just trying to show what happens effectively when i pass to another function 
    new_bodies[0] = *(bodies+1);  //I Think 

내가 bodies[0]에 있었던 초기 구조체를보고 싶다면

, 그건 내가 new_bodies[-1]에 액세스 할 수있는 다른 기능에 의미 하는가?

내가 할 수있는 일인가요? 어떻게 초기 구조체에 액세스 할 수 있습니까?

+1

예. 확실한. 왜 안돼? 'a [b]'는'* (a + b)'로 정의됩니다. – Deduplicator

+1

[C의 음수 배열 인덱스]와 밀접하게 관련됨 (http://stackoverflow.com/q/3473675/1708801) –

답변

11

예, new_bodies[-1]을 사용하여 배열의 초기 요소에 액세스 할 수 있습니다. 이것은 완벽하게 합법적입니다.

대각선 괄호는 +을 쓰는 또 다른 방법이므로 new_bodies[-1]을 쓸 때는 *(new_bodies-1)과 같습니다. new_bodies 이후

bodies[0] 동일 new_bodies[-1] 올라서는 new_bodies-1(bodies+1)-1 또는 bodies이다 bodies+1로서 수득되었다.

가 : 당신이 당신의 struct의 배열의 초기 요소로 요소의 수를 구둣 주걱하려고하는 것 같습니다, 다시 용도 변경 그것의 mass 필드. 이 작업은 가능하지만 메모리 할당 측면에서 모두 최적이 아닙니다 (포인터는 name는 사용하지 않습니다).하지만 가장 중요한 것은 가독성입니다. 명시 적 항목 수를 저장하는 struct에 유연한 배열 구성원을 개시 훨씬 더 될 것이다 :

여기
struct body { 
    char* name; 
    double mass; 
    // ... some more stuff 
}; 
struct bodies { 
    size_t count; 
    body bodies[]; // <<== Flexible array member 
}; 
... 
bodies *bb = malloc(sizeof(bodies)+Number_of_bodies*sizeof(body)); 
bb->count = Number_of_bodies; 

another Q&A with an example of working with flexible array members에 대한 링크입니다.

+0

그건 정확히 내가하려는 것입니다! 이것은 훌륭한 해결책입니다. 매우 감사합니다! – Rohan

관련 문제