【问题标题】:Data gets distorted which is printed in loop数据被扭曲,循环打印
【发布时间】:2020-10-19 08:45:04
【问题描述】:

打印在 malloc 中更新的数据时面临的问题。在下面的代码中,我在 create_tags() 函数中创建了一个字符串 Test.DataType_1.Tag_1 .... Test.DataType_1.Tag_20,当数据正确更新并打印时,我的 create_tags() 函数会正确打印,但如果在 main( ) for 循环数据中的函数被扭曲。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#define NUM_OF_TAGS            (20)
#define NUM_DATA_TYPES         (01)

#define MAX_SUBSCRIPTION        (1)
#define MAX_MONITORED_ITEMS     (2)
#define MAX_ITEMS_TO_CREATE     (20)
   
typedef struct
{
    char nodeID[50];
}TAG_NAME;

typedef struct
{
    int32_t group_id;
    TAG_NAME *tag;
}GROUP;


int32_t max_subscription;
int32_t max_monitored_item;
int32_t max_item_to_create;

void create_tags(GROUP *node)
{
    char t_node[50];
    char r_node[50];
    memset(r_node, 0, sizeof(r_node));
    memset(t_node, 0, sizeof(t_node));

    for(int i = 1; i <= NUM_OF_TAGS; i++)
    {
        sprintf(t_node, "Test.DataType_1.Tag_%d", i);
        strcat(r_node, t_node);
        strcpy(node->tag[i].nodeID, r_node);
        printf("%s\n", node->tag[i].nodeID);
        memset(t_node, 0, sizeof(t_node));
        memset(r_node, 0, sizeof(r_node));
    }
}


int main(void)
{
    max_subscription = MAX_SUBSCRIPTION;
    max_monitored_item = MAX_MONITORED_ITEMS;
    max_item_to_create = MAX_ITEMS_TO_CREATE;

    GROUP *group = NULL;
    /* Grouping Nodes */
    group = malloc(sizeof(GROUP) * max_subscription * max_monitored_item);
    for(int j = 0; j < max_subscription * max_monitored_item; j++)
    {
        group[j].tag  = malloc(sizeof(GROUP) * max_item_to_create);
        memset(group[j].tag, 0, sizeof(GROUP) * max_item_to_create);
        printf("########## Set %d: Start ###########\n", j);
        group[j].group_id = j;
        create_tags(&group[j]);
        printf("########## End %d: Start ###########\n", j);
        printf("\n");
    }

    int32_t count = 0;


    for(int32_t i = 0; i < max_subscription; i++)
    {
        for(int32_t j = 0; j < max_monitored_item; j++)
        {
            printf("============= Start: %d ===============\n", count );
            for (int32_t k = 0; k < max_item_to_create; k++)
            {
                printf("%s\n", group[count].tag[k].nodeID);
            }
            printf("============= End: %d ===============\n", count);
            count++;
        }
    }

}

代码的输出如下,当我在 create_tags() 函数中打印数据时,填充的数据被正确打印在这里打印两次相同的数据。 但是当我在循环中打印相同的内容时,它会在printf("%s\n", group[count].tag[k].nodeID);

########## Set 0: Start ###########
Test.DataType_1.Tag_1
Test.DataType_1.Tag_2
Test.DataType_1.Tag_3
Test.DataType_1.Tag_4
Test.DataType_1.Tag_5
Test.DataType_1.Tag_6
Test.DataType_1.Tag_7
Test.DataType_1.Tag_8
Test.DataType_1.Tag_9
Test.DataType_1.Tag_10
Test.DataType_1.Tag_11
Test.DataType_1.Tag_12
Test.DataType_1.Tag_13
Test.DataType_1.Tag_14
Test.DataType_1.Tag_15
Test.DataType_1.Tag_16
Test.DataType_1.Tag_17
Test.DataType_1.Tag_18
Test.DataType_1.Tag_19
Test.DataType_1.Tag_20
########## End 0: Start ###########

########## Set 1: Start ###########
Test.DataType_1.Tag_1
Test.DataType_1.Tag_2
Test.DataType_1.Tag_3
Test.DataType_1.Tag_4
Test.DataType_1.Tag_5
Test.DataType_1.Tag_6
Test.DataType_1.Tag_7
Test.DataType_1.Tag_8
Test.DataType_1.Tag_9
Test.DataType_1.Tag_10
Test.DataType_1.Tag_11
Test.DataType_1.Tag_12
Test.DataType_1.Tag_13
Test.DataType_1.Tag_14
Test.DataType_1.Tag_15
Test.DataType_1.Tag_16
Test.DataType_1.Tag_17
Test.DataType_1.Tag_18
Test.DataType_1.Tag_19
Test.DataType_1.Tag_20
########## End 1: Start ###########

============= Start: 0 ===============

Test.DataType_1.Tag_1
Test.DataType_1.Tag_2
Test.DataType_1.Tag_3
Test.DataType_1.Tag_4
Test.DataType_1.Tag_5
Test.DataType_1.Tag_6
1.Tag_6
 ===============

Test.DataType_1.Tag_8
Test.DataType_1.Tag_9
Test.DataType_1.Tag_10
Test.DataType_1.Tag_11
Test.DataType_1.Tag_12
Test.DataType_1.Tag_13
Test.DataType_1.Tag_14
Test.DataType_1.Tag_15
Test.DataType_1.Tag_16
Test.DataType_1.Tag_17
Test.DataType_1.Tag_18
Test.DataType_1.Tag_19
============= End: 0 ===============

============= Start: 1 ===============

Test.DataType_1.Tag_1
Test.DataType_1.Tag_2
Test.DataType_1.Tag_3
Test.DataType_1.Tag_4
Test.DataType_1.Tag_5
Test.DataType_1.Tag_6
Test.DataType_1.Tag_7
Test.DataType_1.Tag_8
Test.DataType_1.Tag_9
Test.DataType_1.Tag_10
Test.DataType_1.Tag_11
Test.DataType_1.Tag_12
Test.DataType_1.Tag_13
Test.DataType_1.Tag_14
Test.DataType_1.Tag_15
Test.DataType_1.Tag_16
Test.DataType_1.Tag_17
Test.DataType_1.Tag_18
Test.DataType_1.Tag_19
============= End: 1 ===============

任何关于为什么会发生这种情况的提示都会有所帮助。

【问题讨论】:

  • group[j].tag = malloc(sizeof(GROUP) * max_item_to_create); -> group[j].tag = malloc(sizeof(TAG_NAME) * max_item_to_create);。之后的memset 也一样。
  • 谢谢你,在我身边犯了一个非常愚蠢的错误。
  • for(int i = 0; i &lt; NUM_OF_TAGS; i++)

标签: c linux malloc


【解决方案1】:

在您的main 函数中,您分配group 数组和其中的tag 数组,元素大小为sizeof(GROUP)。此外,在清零标记数组时使用相同的大小:

group = malloc(sizeof(GROUP) * max_subscription * max_monitored_item);

group[j].tag  = malloc(sizeof(GROUP) * max_item_to_create);
memset(group[j].tag, 0, sizeof(GROUP) * max_item_to_create);

由于GROUP 由一个整数和指针组成,它几乎肯定会比50 字节的TAG_NAME 更小。这意味着您没有为其分配足够的空间,这可能会导致稍后在内存领域中缓冲区溢出,您的代码假定它有足够的空间。

在分配(和归零)tag 数组时,您应该使用sizeof(TAG_NAME)。但是,如果您想要对其进行零初始化,您可能想要使用calloc 而不是malloc/memset 组合:

group[j].tag  = calloc(max_item_to_create, sizeof(TAG_NAME));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多