gpt4 book ai didi

c - 交换未知类型的值是否安全

转载 作者:太空狗 更新时间:2023-10-29 16:10:24 25 4
gpt4 key购买 nike

假设我们有以下结构:

typedef struct array
{
size_t sz_of // sizeof an object;
size_t count;
void* objects;
}Array;

嗯,一个可以包含一组任意类型的数组。以下功能旨在应用于此结构:

Array* ArrayNew(size_t len, size_t sz_of){
Array* a = malloc(sizeof(Array));
if(a == NULL)
return NULL;

a->sz_of = sz_of;
a->count = len;
a->objects = malloc(len * sz_of);
if(a->objects == NULL){
free(a);
return NULL;
}

return a;
}

void ArrayDestroy(Array* a){
free(a->objects);
free(a);
}

void* ArrayGet(Array* a, size_t i){
if(i > a->count)
return NULL;

return (a->objects + a->sz_of * i);
}

void ArraySet(Array* a, void* v, size_t i){
if(i > a->count)
return;

memcpy(a->objects + a->sz_of * i, v, a->sz_of);
}

我们有一个函数:

  • 充当构造函数;
  • 充当析构函数;
  • 充当 setter/getter ;
  • 充当二传手。

我添加了一个函数来交换数组的两个元素,但我不确定我是否正确地完成了它。由于 char 的长度为 1 个字节,我暂时将一个元素存储在 char 数组中,该数组的长度为 sz_of:

void ArraySwap(Array* a, size_t x, size_t y){
if(x < a->count && y < a->count){
char t[a->sz_of];
memcpy(t, a->objects + a->sz_of * x, a->sz_of);
memcpy(a->objects + a->sz_of * x, a->objects + a->sz_of * y, a->sz_of);
memcpy(a->objects + a->sz_of * y, t, a->sz_of);
}
}

xy 是需要交换的对象的索引。

它在我的配置上运行良好,但它是否不安全或不符合标准?在全局范围内,如果你看到一些奇怪的、不安全的或不符合标准的东西,你能指出我吗?

感谢您的回答。

最佳答案

代码依赖于 char*,就像指针数学与 void* 一样。一些编译器将 void* 指针数学视为 char*,但最好不要假定非标准行为。

a->objects + a->sz_of * x // not potable.

改为使用 unsigned char *char * 并考虑固定大小的缓冲区 @supercat .这避免了使用可变长度数组 (VLA),它在此处不受限制,并且仅可选在 C11 中支持。

void ArraySwap(Array* a, size_t x, size_t y){
if(x < a->count && y < a->count){
unsigned char *xp = a->objects;
xp += x*a->sz_of;
unsigned char *yp = a->objects;
yp += y*a->sz_of;
unsigned char buf[64];
for (size_t i=0; i<a->sz_of; i += sizeof buf) {
size_t sz = a->sz_of - i;
if (sz > sizeof buf) {
sz = sizeof buf;
}
memcpy(t, xp, sz);
memcpy(xp, yp, sz);
memcpy(yp, t, sz);
xp += sz;
yp += sz;
}
}
}

关于c - 交换未知类型的值是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46797950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com