数组混乱中的C存储结构
早上好, 我目前正在为Pebble Smartwatch开发一个应用程序,它使用标准C语言,这是我刚开始使用的语言 我有一个函数,可以将货币交易添加到数组中。我定义了如下事务:数组混乱中的C存储结构,c,arrays,struct,pebble-watch,C,Arrays,Struct,Pebble Watch,早上好, 我目前正在为Pebble Smartwatch开发一个应用程序,它使用标准C语言,这是我刚开始使用的语言 我有一个函数,可以将货币交易添加到数组中。我定义了如下事务: struct Transaction { char * title; char * amount; char * date; char * text; } txnsArray[20]; 每当我收到一个事务时,它就会使用以下功能添加到txnsArray中: void addTransact
struct Transaction {
char * title;
char * amount;
char * date;
char * text;
} txnsArray[20];
每当我收到一个事务时,它就会使用以下功能添加到txnsArray中:
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++;
}
现在,当我检查这个数组时,它确实按预期添加了条目,但是我添加的最后一个事务适用于所有条目
假设我先添加一笔金额为2.5欧元的交易,然后再添加一笔金额为4.0欧元的交易,那么两个条目都将有4.0欧元
我做错了什么?非常感谢您的帮助。:) 看起来,
dict\u find
函数没有为value->cstring
分配内存,而是为每个调用使用相同的缓冲区。因此数组中的结构以指向相同内存的指针结束,如果dict\u-find
修改它,它将修改所有数组项。看起来dict\u-find
函数不会为value->cstring
分配内存,而是为每个调用使用相同的缓冲区。因此,数组中的结构以指向同一内存的指针结束,如果dict\u find
修改它,它将修改所有数组项。此代码可能有一些未定义的行为。尝试txnsArray[transOverview.txnCounter].amount=malloc(strlen(txnAmount\u Tuple->value->cstring)+1);strcpy(txnsArray[transOverview.txnCounter].amount,txnAmount\u Tuple->value->cstring)
以确保实际复制字符值,而不仅仅是分配mem地址YUP!就这样。非常感谢:]好吧,我继续往下说,并将评论作为对你问题的回答。但是可能值得一读,因为我建议您不要使用strcpy
,而是使用memcpy
,或者,如果需要的话,strncpy
此代码可能有一些未定义的行为。尝试txnsArray[transOverview.txnCounter].amount=malloc(strlen(txnAmount\u Tuple->value->cstring)+1);strcpy(txnsArray[transOverview.txnCounter].amount,txnAmount\u Tuple->value->cstring)
以确保实际复制字符值,而不仅仅是分配mem地址YUP!就这样。非常感谢:]好吧,我继续往下说,并将评论作为对你问题的回答。但是可能值得一读,因为我建议您不要使用strcpy
,而是使用memcpy
,或者,如果需要的话,strncpy