如何正确地将const char数组分配给结构?

时间:2011-11-18 13:26:18

标签: c arrays struct char const

我遇到将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:
    /   :

所以你可以看到它有时是正确的。

我确定我的错误在于结构分配。不幸的是,由于它是专有软件,我无法更好地了解代码。

4 个答案:

答案 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);
}