这是我在这个页面上的第一篇帖子,我几天前才刚学会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(缓冲指针,测试缓冲,测试缓冲长度);“作为最后一个,它至少允许我看到校验和的变化。
1条答案
按热度按时间n53p2ov01#
你忘了取消引用指向“len”的指针。
这意味着“写入len * 指向 * 的变量"。如果您忘记了
*
,您将覆盖指针,而不是指针指向的内容。代码中至少还有一个错误-
memcpy
以字节为单位获取长度,而不是16位字,因此在将长度传递给memcpy之前,必须将长度乘以每个元素的大小。您的编译器可能会警告您这两种情况,您应该认真对待编译器警告,最好启用所有警告(例如GCC/Clang上的
-Wall -Wextra
)