我有一个函数接收堆上分配的未知类型的数据,我想将它复制到数组中的特定位置 . 问题是该功能无法访问数据类型;只是它的地址和大小 .
这是该函数可以访问的信息:
unsigned int count; /* length of the array */
unsigned int pos; /* index in the array */
void *data; /* source data */
size_t elemsize; /* sizeof data type */
void *array = malloc(elemcount * elemsize);
我达到的解决方案是使用memcpy并将数组转换为char *,以便能够在字节级别上解决它 .
memcpy((char*) array + elemsize * pos, (char*) data, elemsize);
但是,我已经阅读了在某些体系结构中使用带有未对齐指针的memcpy时可能出现的问题 .
将源数据转换为char *会使此操作安全吗?
是否有任何情况通过将数组转换为char *(即任何 sizeof(char) != 1
系统)或以这种方式使用memcpy来解决数组问题?
1 回答
这没什么区别 .
没有
sizeof(char) != 1
的系统 . 该标准指定它必须是1
.使用
memcpy
永远不会有任何问题,只要不超出正在读写的对象的边界,并且目标是可写的,并且对象不会重叠 . 特别是没有任何对齐问题 .(如果未成功为该对象构建有效表示,则在尝试访问复制到的对象时可能会出现问题) .
要么你误解了你所读到的内容,要么是错误的信息 . 如果您正在讨论链接的ARM文章中的代码:
如果
unaligned_ptr
未正确对齐unsigned int
,则在执行进入函数体之前,行为已经未定义 . 该页面似乎提供了一种尝试从未定义的行为中恢复的方法 . 这是一个相当糟糕的想法恕我直言,最好不要首先发起未定义的行为;或检测它然后抛出某种致命异常,以便调试和纠正问题 .