2011-11-18 65 views
0

我遇到了将const char数组存储到结构的问题,然后当从一个结构体调用该值时,我并不总是得到期望的值。如何正确地分配一个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_typeupd.xpbu_update_type返回整数(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

能否通过相关部分的调试步骤,看看哪里出了问题? –

+0

我希望你比这里的语法和拼写显示的代码更好地关注代码。 – Indy9000

+0

我无法在调试器上单步执行,因为我只能在没有安装gdb的情况下运行一个特定的linux框。xpbu_transaction_type和xpbu_update_type是全局的。他们从专有API中获取。 – Nathan

回答

1

我怀疑问题在于你放置阵列的定义。

您应该将它们放在全局地址空间中或将它们声明为静态,以便能够将地址共享到任务之间的字符串。

或者,因为BlackBear建议分配内存并复制那里的子字符串。

+0

谢谢,这是他们现在的问题,他们现在是静态char数组'静态字符tx_types [] =“INV/ADD/MOD/DEL/RPL”; static char upd_types [] =“INS/OVR/MOV/DEL”;' – Nathan

0

你必须malloc都update_type和事务,然后使用strcpy并复制重要的部分。你还必须编辑一下你的字符串:“INV \ x00ADD \ x00MOD \ x00DEL \ x00RPL”和“INS \ x00OVR \ x00MOV \ x00DEL”

+0

不,使用'fprintf(“%3.3s”)'不需要nul-terminators。 – aschepler

+0

@aschepler:但strcpy确实 – BlackBear

1

首先,这是tick共享线程吗?如果是这样,那么你必须在关键部分保护其成员的任务,否则当变量正在被打印时,另一个线程正在更新它,从而在打印时造成垃圾。我不确定fprintf()fflush()的线程安全性,您应该了解它,因为它可能是另一个影响因素。

0

您的代码不检查upd.xpbu_transaction_type或upd.xpbu_update_type是否在适当的范围内。

此外,您还需要使用互斥锁或其他东西来保证线程安全。

此外,还不清楚这些字符串实际存储在哪个存储区中。不同的环境对于const字符串将要定位的位置有不同的规则。确保它在全局内存中始终可以由两个执行线程访问。确保这一点的最简单方法是在任何函数外部将字符串定义为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); 
} 
相关问题