gpt4 book ai didi

c - 如何在 C 中实现重叠检查 memcpy

转载 作者:太空狗 更新时间:2023-10-29 17:07:47 28 4
gpt4 key购买 nike

这是一个学习练习。我试图通过在复制操作开始之前通知用户是通过还是失败来扩充 memcpy。我最大的问题如下。如果我分配两个 char 数组,每个 100 字节,并且有两个指针引用每个数组,我怎么知道我正在复制哪个方向?如果我将第一个数组中的所有内容复制到第二个数组中,我如何确保用户不会覆盖原始数组?

我当前的解决方案是比较指针的距离与目标数组的大小。如果两者之间的大小小于我所说的,则会发生覆盖。但是,如果它向另一个方向复制怎么办?我只是有点困惑。

int memcpy2(void *target, void *source, size_t nbytes) {
char * ptr1 = (char *)target;
char * ptr2 = (char *)source;


int i, val;

val = abs(ptr1 - ptr2);
printf("%d, %d\n", val, nbytes + 0);
if (val > nbytes) {
for (i = 0; i < val; i++){
ptr1[i] = ptr2[i];
}
return 0; /*success */
}
return -1; /* error */
}



int main(int argc, char **argv){

char src [100] = "Copy this string to dst1";
char dst [20];
int p;
p = memcpy2(dst, src, sizeof(dst));

if (p == 0)
printf("The element\n'%s'\nwas copied to \n'%s'\nSuccesfully\n", src, dst);
else
printf("There was an error!!\n\nWhile attempting to copy the elements:\n '%s'\nto\n'%s', \n Memory was overlapping", src, dst);
return 0;


}

最佳答案

确定两个内存范围是否重叠的唯一便携方法是:

int overlap_p(void *a, void *b, size_t n)
{
char *x = a, *y = b;
for (i=0; i<n; i++) if (x+i==y || y+i==x) return 1;
return 0;
}

这是因为指针与关系运算符的比较是未定义的,除非它们指向同一个数组。实际上,比较确实适用于大多数现实世界的实现,因此您可以执行以下操作:

int overlap_p(void *a, void *b, size_t n)
{
char *x = a, *y = b;
return (x<=y && x+n>y) || (y<=x && y+n>x);
}

我希望我的逻辑是正确的;你应该检查一下。如果您想假设可以获取任意指针的差异,则可以进一步简化它。

关于c - 如何在 C 中实现重叠检查 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095488/

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