我有以下结构:
uint8_t broadcastAddress[] = {0x10, 0x11, 0x12, 0x00, 0x2A, 0x7C};
typedef struct struct_message {
int request_type;
char message[100];
float thermal_data[NUMBER_OF_THERMALCOUPLE];
} struct_message;
typedef struct struct_parameter {
struct_message *message;
uint8_t broadcastAddress;
char label[10];
} struct_parameter;
struct_parameter parameter_Data;
然后在setup()
方法中,我设置了以下内容:
memcpy(¶meter_Data.broadcastAddress, broadcastAddress, sizeof(broadcastAddress));
strcpy(parameter_Data.label , "123454");
然后在loop()
中,我打印此值:
Serial.println(data.label);
一切都很好,但当我想为struct_message
设置一个属性时,我的板会重新启动。
parameter_Data.message->request_type = 1;
有线索吗?我可能做错了。
您当前在struct_parameter
中有一个指向struct_message
的指针。除非明确分配struct_message
,否则不会为其分配存储空间,并且指针将为0或某个随机数。因此,当您尝试在消息中设置request_type
时,您正在向内存中的一个随机位置写入内容,这会导致崩溃。
更好的选择是让struct_message
成为struct_parameter
的成员,而不是使用指向它的指针
typedef struct struct_parameter {
struct_message message;
uint8_t broadcastAddress;
char label[10];
} struct_parameter;
删除*
,则告诉C++将整个struct_message
放在struct_parameter
内,而不仅仅是一个指针
然后你会写:
parameter_Data.message.request_type = 1;
这样就省去了为message
管理内存的需要。