如何在通过char指针传递的函数中使用memcpy?

问题描述 投票:0回答:2

我对c语言中的指针很陌生。这是我正在处理的代码片段。我可能未正确传递指针,但无法弄清楚出了什么问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
__uint16_t CCrc8();
__uint16_t process_command();


int main () {

    //command format: $SET,<0-1023>*<checksum,hex>\r\n
    char test_payload[] = "SET,1023*6e";
    process_command(test_payload);

    return 0;
}


__uint16_t process_command(char *str1) {

    char local_str[20];
    memcpy(local_str, str1, sizeof(str1));

    printf(str1);
    printf("\n");
    printf(local_str);
}

这导致:

SET,1023*6e                                                                                                       
SET,1023

我希望这两行都相同。超过8个字符的任何内容都将保留。

我唯一可以确定的问题是sizeof(str1)。任何帮助表示赞赏。

更新:我了解到sizeof(* char)在16位系统上为2,在32位系统上为4,在64位系统上为8。因此,当不确定大小时,如何使用memcpy获取str1的本地副本?

string pointers memcpy
2个回答
0
投票

sizeof是编译器关键字。您需要的是strlen中的#include <string.h>

sizeof的值在编译时确定。例如,sizeof(char[10])仅表示10。另一方面,strlen是一个libc函数,可以动态确定字符串长度。


0
投票
指针上的

sizeof告诉您指针本身的大小,而不是指针指向的大小。由于您使用的是64位系统,因此指针的长度为8个字节,因此memcpy始终会复制8个字节。由于您的字符串以null终止,因此应该使用stpncpy,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.