Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组混乱中的C存储结构_C_Arrays_Struct_Pebble Watch - Fatal编程技术网

数组混乱中的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

早上好, 我目前正在为Pebble Smartwatch开发一个应用程序,它使用标准C语言,这是我刚开始使用的语言

我有一个函数,可以将货币交易添加到数组中。我定义了如下事务:

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