C语言函数无法修改数组及校验值异常问题求助
问题分析与修复
核心问题1:memcpy 字节数计算错误
你在create_test_buffer里调用memcpy时,第三个参数传的是TEST_BUFFER_LEN——这是数组的元素个数,但memcpy要求传入的是字节数。uint16_t类型每个元素占2字节,所以正确的字节数应该是TEST_BUFFER_LEN * sizeof(uint16_t)。之前的写法只复制了512字节(即256个uint16_t元素),剩下的元素仍为初始值0,导致校验和不符合预期。
核心问题2:修改len的方式错误
函数里的len = TEST_BUFFER_LEN;只是修改了局部指针变量len的值,并没有改变外部的test_len变量。正确的写法是通过指针间接赋值:*len = TEST_BUFFER_LEN;,这样才能把长度值同步回主函数。
额外说明:test_ptr的打印问题
你用printf("test_ptr before: %x\n", test_ptr);打印的是数组的内存地址,数组名作为参数传递时会退化为指针,地址本身不会改变,所以前后打印结果必然一致。要验证数组内容是否被修改,应该循环打印数组元素,或者查看修正后的校验和。
修复后的完整代码
#include <stdint.h> #include <stdio.h> #include <string.h> #define TEST_BUFFER_LEN 512 #define NETWORK_SCAN_LIST_SIZE 8 typedef struct { char ssid[33]; } wifi_ap_record_t; wifi_ap_record_t ap_info_struct[NETWORK_SCAN_LIST_SIZE] = { {.ssid="SSID_3"}, {.ssid="SSID_1"}, {.ssid="SSID_1"}, {.ssid="SSID_1"}, {.ssid="SSID_1"}, {.ssid="SSID_2"}, {.ssid="SSID_1"}, {.ssid="SSID_1"}, }; uint16_t test_ptr[TEST_BUFFER_LEN]; uint16_t test_len = 0; static void create_test_buffer(uint16_t *, uint16_t *); static uint16_t calculate_checksum(uint16_t *, uint16_t); int main() { printf("test_ptr address before: %x\n", (unsigned int)test_ptr); printf("len before: %u\r\n", test_len); create_test_buffer(test_ptr, &test_len); printf("test_ptr address after: %x\n", (unsigned int)test_ptr); printf("len after: %u\r\n", test_len); uint16_t checksum = calculate_checksum(test_ptr, TEST_BUFFER_LEN); printf("Checksum: %u\r\n", checksum); // 可选:打印前几个元素验证修改效果 for(int i=0; i<5; i++){ printf("test_ptr[%d] = %u\n", i, test_ptr[i]); } return 0; } static void create_test_buffer(uint16_t *buff_ptr, uint16_t *len) { static uint16_t test_buffer[TEST_BUFFER_LEN]; for (uint16_t idx = 0 ; idx < TEST_BUFFER_LEN; ++idx) { test_buffer[idx] = 0x64; // 0x64对应十进制100 } // 修正memcpy的字节数参数 memcpy(buff_ptr, test_buffer, TEST_BUFFER_LEN * sizeof(uint16_t)); // 修正长度赋值方式 *len = TEST_BUFFER_LEN; } static uint16_t calculate_checksum(uint16_t *data, uint16_t len) { uint16_t idx = 0; uint16_t checksum = 0; while (idx < len) { checksum += data[idx]; idx++; } return checksum; }
修复后的预期结果
test_len会被正确设置为512- 校验和会等于
512*100=51200 - 数组每个元素的值均为100
内容的提问来源于stack exchange,提问作者Nicolas Murcia
相关产品推荐
相关产品推荐

