2013-04-17 2 views
2

나는 구조체의 배열이 이런 식으로 선언이 : 나중에 내가 이런 식으로 작성하는 코드의왜 이런 방식으로 C의 구조체 배열에 쓸 수 없습니까?

typedef struct { 
    int a; 
    int b; 
} buffer_t; 

buffer = (buffer_t *) calloc(SIZE, sizeof(buffer_t)); 

:

buffer_t temp = buffer[id]; 
temp.a = new_a; 
temp.b = new_b; 

을하지만 아무것도 내가 그것을 그런 식으로 쓸 때 스틱 것 같다 . 대신 이렇게하면 :

buffer[id].a = new_a; 
buffer[id].b = new_b; 

잘 작동합니다.

내가 뭘 잘못하고 있니? 여기서 중요한 부분을 놓치고 있습니까?

(I 가능한이 효율적하고 싶다 그래서 나는 ... 내 내부 루프에서이 코드가)

나는 ++ 2008이 중요한 경우 비주얼 C를 사용하고 있습니다. struct 값이 복사되기 때문에

+0

구조체로 정의했습니다. 나는 그것이 가치 의미론을 가지고 있다고 가정한다. –

답변

7

이다 : 당신이

buffer_t temp = buffer[id]; 

tempid의 인덱스에있는 항목의 사본를 얻을 쓸 때. 사본을 원하는대로 수정할 수는 있지만 다시 지정하지 않으면 (예 : buffer[id] = temp) 변경 사항이 "적용되지 않습니다".

포인터 수정이 문제를 사용 :

buffer_t *temp = &buffer[id]; 
temp->a = new_a; 
temp->b = new_b; 

이제 tempbuffer[id]에서 struct에, 그래서 모든 수정은하지 사본에서 struct 자체에 발생합니다.

+0

어떻게 그 중요한 세부 사항을 간과 할 수 있었는지 나는 모른다. 감사합니다! – c00kiemonster

0

임시 변수를 만들 때 복사, 참조를 만들지 않습니다. 변수가 서로 수정되도록하려면 참조를 사용할 수 있습니다.

buffer_t &temp = buffer[id]; 
temp.a = new_a 
temp.b = new_b 
+0

C에는 참조가 없습니다. C++ 않습니다. 이것은 C++가 아니라 C입니다. – icktoofay

+0

@icktoofay : C가 참조를 가지고 있지 않은 것은 사실이지만, 질문을하는 사람은 분명히 하나를 생성하기위한 '임시'선언을 기대하고있었습니다. 제안 된 솔루션은 참고로 C 포인터를 사용하도록 조정해야하지만 원래 코드는 "참조"를 작성하지 않았 음을 언급하는 것이 좋습니다. – supercat

+0

@supercat : 물론 원래 코드가 참조를 작성하지 않는다는 것이 좋지만 제안 된 솔루션은 C와 작동하지 않습니다. – icktoofay

관련 문제