首页 文章

将未知类型的数据复制到C中的数组中

提问于
浏览
1

我有一个函数接收堆上分配的未知类型的数据,我想将它复制到数组中的特定位置 . 问题是该功能无法访问数据类型;只是它的地址和大小 .

这是该函数可以访问的信息:

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 回答

  • 2

    将源数据转换为char *会使此操作安全吗?

    这没什么区别 .

    是否有任何情况通过将数组转换为char *(即sizeof(char)!= 1的任何系统)或以这种方式使用memcpy来解决数组可能会导致问题?

    没有 sizeof(char) != 1 的系统 . 该标准指定它必须是 1 .

    使用 memcpy 永远不会有任何问题,只要不超出正在读写的对象的边界,并且目标是可写的,并且对象不会重叠 . 特别是没有任何对齐问题 .

    (如果未成功为该对象构建有效表示,则在尝试访问复制到的对象时可能会出现问题) .

    在某些体系结构中使用带有未对齐指针的memcpy时,我已经读过可能出现的问题 .

    要么你误解了你所读到的内容,要么是错误的信息 . 如果您正在讨论链接的ARM文章中的代码:

    void example (unsigned int * const unaligned_ptr)
    {
    

    如果 unaligned_ptr 未正确对齐 unsigned int ,则在执行进入函数体之前,行为已经未定义 . 该页面似乎提供了一种尝试从未定义的行为中恢复的方法 . 这是一个相当糟糕的想法恕我直言,最好不要首先发起未定义的行为;或检测它然后抛出某种致命异常,以便调试和纠正问题 .

相关问题