Tag: 重叠

Valgrind警告:我应该认真对待它

背景:我有一个模仿fgets(character, 2, fp)的小例程,除了它从字符串而不是流中获取字符。 newBuff是动态分配的字符串,作为参数传递,字符声明为char character[2] 。 常规: character[0] = newBuff[0]; character[1] = ‘\0’; strcpy(newBuff, newBuff+1); strcpy在从中读取每个字符时复制信息丢失。 问题:Valgrind确实警告我这个活动,“源和目的地重叠在strcpy(0x419b818,0x419b819)”。 我应该担心这个警告吗?

检测两个字符串之间的重叠长度

int overlap(const char *s1, const char *s2){ int i = 0; while (s1[i] && s2[i] && s1[i] == s2[i]) i++; return i; } 这将返回作为输入的两个字符串之间的子字符串重叠的长度。 但是,如果两个字符串是: abcdefg 1234efg 它返回0的重叠,因为它只能读取从字符串开头开始的重叠,有人可以修改或帮助我做它,以便它可以读取重叠没有mantter它们在字符串中的位置吗?

如何修复strcpy以便检测重叠的字符串

在一次采访中,我被要求编写strcpy的实现,然后修复它以便正确处理重叠的字符串。 我的实现在下面,它是非常天真的..我如何修复它,以便a)它检测重叠的字符串和b)检测后..我们如何处理重叠并继续? char* my_strcpy(char *a, char *b){ if(a == NULL || b == NULL){ return NULL; } if(a > b){ //we have an overlap? return NULL; } char *n = a; while(*b != ‘\0’){ *a = *b; a++; b++; } *a = ‘\0’; return n; } int main(int argc, char *argv[]) { char str1[] = […]

请查看重叠内存块的memcpy()的这种莫名其妙的行为和输出

在阅读了关于memcpy()的以下内容之后,我继续阅读有关memmove() : To avoid overflows, the size of the arrays pointed by both the destination and source parameters, shall be at least num bytes, and should not overlap (for overlapping memory blocks, memmove is a safer approach). (链接) 在检查用于说明memmove()的工作的程序之后,我决定使用memcpy()来调整它,而不是看看输出有多么不同。令我惊讶的是,它们是相同的,即使它是重叠内存块的情况这是程序和输出,之后我开始描述我的困惑: #include #include int main () { char str[] = “memmove can be very useful……”; //memmove (str+20,str+15,11); […]

使用memcpy时重叠的含义

我试图理解在C库定义的函数memcpy() 语法: void *memcpy(void*dst,const void*src,size_t n); 我知道这个函数用于将指针src指向的内存的内容复制到dst指针指向的位置,并返回dst指针指向的地址。 我无法理解以下有关memcpy()重要声明: 使用memcpy() ,内存地址不应重叠,如果重叠,则memcpy()未定义。 另一个查询是:传递给函数的第三个参数的值,即size_t n是否总是一个整数值?