如何将数据组赋值给结构体中的指针?代码问题求助
正确将数组赋值给结构体指针成员的实现方法
原代码的核心错误
- 指针成员
payload未指向有效内存就直接拷贝数据:原代码直接把数组内容拷贝到指针变量本身的内存(&message.payload),这会覆盖指针的地址值,而非指针指向的存储区域。 - 类型不匹配错误:将
uint8_t**类型的&message.payload赋值给TestStruc*类型的指针,导致后续非法内存访问。 - 错误的数组初始化:第二个代码中用字符串文本初始化单个
uint8_t变量,既类型不匹配,也无法得到二进制的0x10等值。
正确实现方案
要给指针成员payload赋值数组,需先让指针指向一块足够容纳数组的内存,再用memcpy拷贝数据。以下是两种可行方式:
方式1:静态分配内存(使用栈上数组)
#include <stdio.h> #include <string.h> typedef unsigned char uint8_t; typedef struct { uint8_t id; uint8_t commandId; uint8_t* payload; } TestStruc; int main() { uint8_t Array[4] = {0x10, 0x11, 0x12, 0x13}; TestStruc message = {0}; // 静态分配一块能容纳4个uint8_t的内存,让payload指向它 uint8_t payload_buf[4]; message.payload = payload_buf; // 将数组内容拷贝到payload指向的内存 memcpy(message.payload, Array, sizeof(Array)); // 打印验证结果 for(int i = 0; i < 4; i++){ printf("0x%02X ", message.payload[i]); } printf("\n"); return 0; }
方式2:动态分配内存(使用堆内存)
如果需要内存在函数外也能使用,推荐用动态分配:
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef unsigned char uint8_t; typedef struct { uint8_t id; uint8_t commandId; uint8_t* payload; } TestStruc; int main() { uint8_t Array[4] = {0x10, 0x11, 0x12, 0x13}; TestStruc message = {0}; // 动态分配内存,大小等于数组长度 message.payload = (uint8_t*)malloc(sizeof(Array)); if(message.payload == NULL){ printf("内存分配失败\n"); return -1; } // 拷贝数据 memcpy(message.payload, Array, sizeof(Array)); // 打印验证结果 for(int i = 0; i < 4; i++){ printf("0x%02X ", message.payload[i]); } printf("\n"); // 动态分配的内存记得释放 free(message.payload); message.payload = NULL; return 0; }
关键点说明
- 必须确保
payload指向的内存大小≥要拷贝的数组长度,避免内存越界。 - 动态分配内存后,使用完毕一定要调用
free释放,防止内存泄漏。 - 打印指针指向的数组时,需要遍历每个元素,直接打印指针本身只会输出地址值。
内容的提问来源于stack exchange,提问作者0983
相关产品推荐
相关产品推荐

