【问题标题】:static struct in C not changing valueC中的静态结构不改变值
【发布时间】:2013-05-28 09:56:28
【问题描述】:

为了在程序执行期间保留变量(char 数组)的值,我有以下代码用于更大的代码。但是我看到 incrementCtr 没有效果,因为计数器被重置为零。你能指出在这里使用静态的正确方法吗?

    static typedef struct {
        uint8_t data[8];
    }count_t;

    ......
    static count_t count;

    static void incrementCtr(count_t* count) {
        int i;
        for (i = sizeof(count->data) - 1; i >= 0; --i) {
            if (++count->data[i] != 0) {
                break;
            }
        }
    }

    void myroutine{
        .....


        ....

        count_t *counter;
        counter = &count;
        uint32_t len = sizeof(*counter);
        memset(counter ,0,sizeof(*counter));
        for (i = 0; i < len; i++){
            printf("counter->data[%d] = %02X\n", i, counter->data[i]);
        }
        .......
do {
        .......
        incrementCtr(counter);
         for (i = 0; i < len; i++){
            printf("counter->data[%d] = %02X\n", i, counter->data[i]);
         }
        } while (true);
        return 0;
    }

第一个 printf 显示所有字节 0,在第二个 printf 中,字节值增加 1。但随后计数器重新初始化为 0 agian :(

【问题讨论】:

  • 在同一代码中混合使用 "count_t count"、"count_t* count" 和 "++count->..." 不太可读。例如,我建议将您的指针重命名为“count_t* pCouint”。
  • 你的意思是当你第二次调用myroutine(这应该是一个函数,对吗?)它再次归零?那是因为 memset 你在那里,这正是它的作用......
  • @Daniel:我不认为缺少匈牙利符号(个人不喜欢它,但不管对你有用......)是这里最大的问题......说sizeof(*counter)当你真正的意思是sizeof(counter-&gt;data)/sizeof(*counter-&gt;data) 要严重得多。
  • 感谢 cha0site。 memset是杀手。我以为我只是在循环,但没有看到 myroutine 被调用。我仍然不知道你为什么说 sizeof(*counter) 是错误的。考虑到我正在处理整个结构,我认为 memset 很好,sizeof 给了我结构的大小而不是指针大小
  • @cha0site 我不是在提议匈牙利语,只是不重复相同的变量名。对我来说,“static count_t a”和“static void incrementCtr(count_t* b)”也可以。我反对重复“计数”。

标签: c struct


【解决方案1】:

如果您在头文件中定义了static count_t count;,可能会发生这种情况。在这种情况下,对于包含此标头的任何翻译单元(cpp 文件),您都有单独的 count 变量。

【讨论】:

  • 谢谢。那和 memset 是问题所在。我已经更正了。
猜你喜欢
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多