我对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的本地副本?
sizeof
是编译器关键字。您需要的是strlen
中的#include <string.h>
。
sizeof
的值在编译时确定。例如,sizeof(char[10])
仅表示10
。另一方面,strlen
是一个libc函数,可以动态确定字符串长度。
sizeof
告诉您指针本身的大小,而不是指针指向的大小。由于您使用的是64位系统,因此指针的长度为8个字节,因此memcpy
始终会复制8个字节。由于您的字符串以null终止,因此应该使用stpncpy
,如下所示: