【问题标题】:How do I correctly assign a const char array to a struct?如何正确地将 const char 数组分配给结构?
【发布时间】:2012-01-01 06:11:39
【问题描述】:

我在将 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 分别返回整数 (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:
    /   :

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

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

【问题讨论】:

  • 你能在调试器中单步调试相关部分,看看哪里出了问题吗?
  • 希望大家多关注代码而不是这里显示的语法和拼写。
  • 我无法单步调试调试器,因为我只能在没有安装 gdb 的情况下运行一个特定的 linux 机器。xpbu_transaction_type 和 xpbu_update_type 是全局的。它们取自专有 api。

标签: c arrays struct char constants


【解决方案1】:

我怀疑问题出在您将数组定义放在哪里。

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

或者按照 BlackBear 的建议分配内存并将子字符串复制到那里。

【讨论】:

  • 谢谢你这是个问题,他们现在是静态字符数组static char tx_types[] = "INV/ADD/MOD/DEL/RPL"; static char upd_types[] = "INS/OVR/MOV/DEL";
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您必须同时 malloc update_type 和 transaction 然后使用 strcpy 并复制重要部分。您还必须编辑一些字符串:“INV\x00ADD\x00MOD\x00DEL\x00RPL”和“INS\x00OVR\x00MOV\x00DEL”

    【讨论】:

    • 不,fprintf("%3.3s") 的使用不需要空终止符。
    【解决方案4】:

    您的代码没有检查 upd.xpbu_transaction_type 或 upd.xpbu_update_type 是否在正确的范围内。

    您还需要使用 Mutex 或其他东西来确保线程安全。

    此外,这些字符串实际存储在哪个内存区域中也不是很清楚。不同的环境对于 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多