2014-03-12 3 views
0

안녕하세요, 저는 방금 시작한 언어 인 표준 C를 사용하는 Pebble Smartwatch 용 앱을 만들고 있습니다.C - Struct 구조체 배열 혼동

나는 Money Transaction을 배열에 추가하는 함수를 가지고있다. 나는 다음과 같이 트랜잭션을 정의했습니다 :

나는 그것이이 기능을 사용하여 txnsArray에 추가 트랜잭션받을 때마다
struct Transaction { 
    char * title; 
    char * amount; 
    char * date; 
    char * text; 
} txnsArray[20]; 

:이 예정대로 나는이 배열이 항목을 추가 않는 확인할 때 이제

void addTransaction(DictionaryIterator * txnIter){ 
    Tuple *txnTitle_Tuple = dict_find(txnIter, TRANSACTION_TITLE); 
    Tuple *txnAmount_Tuple = dict_find(txnIter, TRANSACTION_AMOUNT); 
    Tuple *txnText_Tuple = dict_find(txnIter, TRANSACTION_TEXT); 


    txnsArray[transOverview.txnCounter].title = txnTitle_Tuple->value->cstring; 
    txnsArray[transOverview.txnCounter].amount = txnAmount_Tuple ->value->cstring; 
    txnsArray[transOverview.txnCounter].text = txnText_Tuple->value->cstring; 

    transOverview.txnCounter++; 

} 

을 to, 그러나 내가 추가 한 마지막 트랜잭션은 모든 항목에 적용됩니다.

먼저 거래량에 2.5 유로를 추가하고 다른 하나에 4.0 유로를 추가하면 두 항목 모두 4.0 유로가됩니다.

내가 뭘 잘못하고 있니? 도움을 많이 주시면 감사하겠습니다. :)

+1

이 코드에는 _undefined _ 가능한 동작이 있습니다. 'txnsArray [transOverview.txnCounter] .amount = malloc (strlen (txnAmount_Tuple -> value-> cstring) +1); stcharpy (txnsArray [transOverview.txnCounter] .amount, txnAmount_Tuple -> value-> cstring);'_char_ 값이 실제로 복사되고 mem- 주소가 할당되지 않도록 보장하기 위해 –

+0

예! 그거였다. 고마워요.] – JohannesRu

+0

글쎄, 나는 계속해서 질문에 대한 답을 달았습니다. 내가 'strcpy'를 쓰지 말고,'memcpy'를, 또는 필요하다면'strncpy'를 사용하길 권하고 싶습니다. –

답변

4

value->cstring에 메모리를 할당하지 않고 각 호출마다 동일한 버퍼를 사용하는 것처럼 보입니다. 따라서 배열의 구조체는 동일한 메모리에 대한 포인터로 끝나고 dict_find이 수정하면 모든 배열 항목이 수정됩니다.