C语言 循环打印的数据失真



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

#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("%sn", 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("%sn", group[count].tag[k].nodeID);
}
printf("============= End: %d ===============n", count);
count++;
}
}
}

代码的输出如下,当我在 create_tags(( 函数中打印数据时,填充的数据在这里正确打印,并打印两次相同的数据。 但是当我循环打印相同的内容时,它会在printf("%sn", 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 ===============

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

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));

最新更新