我遇到将const char数组存储到结构中的问题,然后在从结构调用值时,我并不总是得到预期的值。
以下是代码:
typedef struct
{
char *update_type;
char *transaction;
} TickType;
在我有一个帖子中:
const char tx_types[] = "INV/ADD/MOD/DEL/RPL";
const char upd_types[] = "INS/OVR/MOV/DEL";
tick->transaction = &tx_types[4*upd.xpbu_transaction_type];
tick->update_type = &upd_types[4*upd.xpbu_update_type];
此 upd.xpbu_transaction_type ,此 upd.xpbu_update_type 分别返回ints(0-4)和(0-3)。在另一个线程中,我们打印到文件:
fprintf(out, "%3.3s/%3.3s:\n",tick->transaction, tick->update_type);
fflush(out);
问题是签出输出文件时我看到以下内容:
+MOD/DEL:
+ / Â +:
+MOD/DEL:
+MOD/ :
/@Ea:
/<90>Ea:
/Ã Ea:
/0Fa:
/ :
所以你可以看到它有时是正确的。
我确定我的错误在于结构分配。不幸的是,由于它是专有软件,我无法更好地了解代码。
答案 0 :(得分:1)
首先,这个tick
是否在线程之间共享?如果是这样,那么你必须在一个关键部分保护其成员的赋值,否则可能有可能在打印变量时,另一个线程正在更新它,导致打印时出现乱码。我不确定fprintf()
和fflush()
的线程安全性,你也应该发现它,因为它可能是另一个影响因素。
答案 1 :(得分:1)
我怀疑问题在于您放置数组的定义。
您应该将它们放在全局地址空间中,或者将它们声明为静态,以便能够将地址共享到任务之间的字符串。
另外,当BlackBear建议分配内存并复制子字符串时。
答案 2 :(得分:0)
你必须malloc update_type和transaction然后使用strcpy并复制重要的部分。您还必须编辑一下您的字符串:“INV \ x00ADD \ x00MOD \ x00DEL \ x00RPL”和“INS \ x00OVR \ x00MOV \ x00DEL”
答案 3 :(得分:0)
您的代码不会检查upd.xpbu_transaction_type或upd.xpbu_update_type是否在适当的范围内。
此外,您还需要使用Mutex或其他东西来保证线程安全。
同样不清楚这些字符串实际存储在哪个内存区域。不同的环境对const字符串的位置有不同的规则。确保它位于全局内存中,并且两个执行线程始终可以访问它。确保这一点的最简单方法是将字符串定义为任何函数之外的const。如果它必须在函数中,则必须将其声明为static const。
根据您的环境,这样的简单就足够了:
主题A:
/* validate upd values, etc*/
switch (upd.xpbu_transaction_type)
{
...
default:
xpbu_tt = 0;
}
...
taskLock();
tick->transaction = &tx_types[4*xpbu_tt];
tick->update_type = &upd_types[4*xpbu_ut];
taskUnlock();
主题B:
While (1)
{
...
taskLock();
t = tick->transaction;
u = tick->update_type;
taskUnlock();
fprintf(out, "%3.3s/%3.3s:\n",t,u);
fflush(out);
}