【发布时间】: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 < NUM_OF_TAGS; i++)