You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:05:21