我已经在C中创建了一个函数,但它似乎没有对我要修改的变量进行任何更改

pcww981p  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(90)

这是我在这个页面上的第一篇帖子,我几天前才刚学会C语言。
这个C代码有一个问题,这个想法是函数“create_test_buffer”修改变量“test_ptr”,在每个位置增加一个值100,但是当我在调用函数后再次打印“test_ptr”时,似乎什么都没有改变。
校验和似乎也没有被修改,假设如果您在每个位置添加值100,那么数组总共有512个位置,您应该得到512*100=51200,但它显示的是6400。

#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 before: %x\n", test_ptr);
    printf("len before: %x\r\n", test_len);
    create_test_buffer(test_ptr, &test_len);
    printf("test_ptr after: %x\n", test_ptr);
    printf("len after: %x\r\n", test_len);
    uint16_t checksum = calculate_checksum(test_ptr, TEST_BUFFER_LEN);
    printf("Checksum: %x\r\n", checksum);

    return 0;
}

static void create_test_buffer(uint16_t *buff_ptr, uint16_t *len)
{
#define TEST_BUFFER_LEN 512
    static uint16_t test_buffer[TEST_BUFFER_LEN];
    for (uint16_t idx = 0 ; idx < TEST_BUFFER_LEN; ++idx) {
        test_buffer[idx] = 0x64;
    }
    memcpy(buff_ptr, test_buffer, TEST_BUFFER_LEN);
    // buff_ptr = test_buffer;
    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;
}

至于我试图改变参数修改方式的函数,首先我尝试了“len = TEST_BUFFER_LEN;然后用“memcpy(缓冲指针,测试缓冲,测试缓冲长度);“作为最后一个,它至少允许我看到校验和的变化。

n53p2ov0

n53p2ov01#

你忘了取消引用指向“len”的指针。

*len = TEST_BUFFER_LEN;

这意味着“写入len * 指向 * 的变量"。如果您忘记了*,您将覆盖指针,而不是指针指向的内容。
代码中至少还有一个错误-memcpy以字节为单位获取长度,而不是16位字,因此在将长度传递给memcpy之前,必须将长度乘以每个元素的大小。

memcpy(buff_ptr, test_buffer, TEST_BUFFER_LEN * sizeof(uint16_t));

您的编译器可能会警告您这两种情况,您应该认真对待编译器警告,最好启用所有警告(例如GCC/Clang上的-Wall -Wextra

相关问题