【发布时间】:2020-06-20 18:54:33
【问题描述】:
我在其他地方粘贴了下面的代码,但建议它是一个糟糕的解决方案。该标准对 memcpy 有这样的说法:
"memcpy 函数将 s2 指向的对象中的 n 个字符复制到 s1 指向的对象。如果复制发生在重叠的对象之间,则行为 未定义。”
关于 uint32_t:
"typedef 名称 uintN_t 指定一个宽度为 N 且没有 填充位。因此,uint24_t 表示这样一个无符号整数类型,其宽度为 正好是 24 位。”
是否存在对齐问题?我一直在 linux 上使用它,从未遇到任何错误等。当我不得不担心字节顺序时,我只使用按位操作进行访问,例如通过来自另一个架构的链接接收数据。请投一些光。
#include <stdio.h>
#include<string.h>
#include<stdint.h>
char* pointer = "HelloWorld!Hell!";
uint32_t arr[4];
unsigned char myArray[16];
int main(void) {
memcpy(arr, pointer, (size_t)16);
// Is this illegal ?
char *arr1 = (char *)arr;
for(int i = 0 ; i < 16; i++)
{
printf("arr[%d]=%c\n", i, arr1[i]);
}
}
【问题讨论】:
-
嗯,问题是
sizeof("HelloWorld!Hell!")是 17,所以我不知道除了纯粹的运气之外是什么终止了printf,但memcpy通常是最符合标准的复制方法从一种表示到另一种表示的数据。 -
不是运气不好,linux上的bss数据初始化为零,零是空字节AFAIK的ascii值。但这不是这里要问的。造成混乱是我的坏事。
-
请注意
(size_t)在memcpy(arr, pointer, (size_t)16);中不需要转换。为了让一些警告符号的迂腐编译器安静下来,可以使用16u。第二种选择:memcpy(arr, pointer, sizeof arr); -
@PiyushSingh:
sizeof(arr)是 16,您将 16 个字符存储到数组中,没有空终止符。 “Linux 上的 bss 数据”注释是无关紧要的,它是 C 标准,它要求将静态和全局变量初始化为零,因此除非您竭尽全力告诉编译器违反此要求,否则它们将为零。由于memcpy很好,并且通过char*为指针别名也很好,这是(在编辑之前)你唯一的问题,这就是我说它的原因。