我正在尝试复制memcpy函数,但是当我尝试将两个参数都设置为NULL但具有大小(例如5)时,原始函数给出了中止错误,但我的程序写入了随机字符。
void *ft_memcpy(void *dst, const void *src, size_t n)
{
size_t i;
char *d;
char *s;
s = (char*)src;
d = (char*)dst;
i = 0;
while (i < n)
{
d[i] = s[i];
i++;
}
i = 0;
return (dst);
}
int main()
{
char dst[0];
char src[0];
size_t n = 5;
printf("%s", ft_memcpy(dst, src, n));
printf("%s\n", memcpy(dst, src, n));
return (0);
}
[src
和dst
的大小为0,这是在C中指定灵活数组的一种方法。通常,您仅在要动态分配的结构中定义它们,例如:]]
struct buffer { size_t len; char bytes[0] }; #define NBYTES 8 struct buffer* ptr = malloc(sizeof(struct buffer) + NBYTES); const char* src = "hello!"; ptr->len = strlen(src); memcpy(ptr.bytes, src, ptr->len);
基本上,索引示例中的任何这些数组都会导致缓冲区溢出(您正在访问超出数组限制的位置。)>
此参数与传递
NULL
作为参数之间的区别是src
和dst
指向有效内存(main
功能堆栈)。在C语言中,缓冲区溢出没有定义的行为(未定义的行为),因此编译器可以自由执行所需的操作。如果您使用内存清理器(用-fsanitize=address
编译),它将警告您有关此问题的信息,并要求您纠正错误。
我建议您使用调试器或在复制功能中添加以下打印语句:
printf("%s: src: %p, dst: %p\n", __func__, src, dst);