From: Kohn Emil Dan Newsgroups: comp.os.msdos.djgpp,comp.lang.c Subject: Re: Copying memory to memory problems Date: Mon, 13 Jul 1998 19:31:36 +0300 Organization: Technion, Israel Institute of Technology Lines: 50 Message-ID: References: <35a7cf26 DOT 7861242 AT news DOT unisys DOT com DOT br> NNTP-Posting-Host: csd.cs.technion.ac.il Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII In-Reply-To: <35a7cf26.7861242@news.unisys.com.br> To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk Hi! On Sat, 11 Jul 1998, Bruno Barberi Gnecco wrote: > I need to move a part of an array to some bytes ahead. I'd do it using: > for (i = size; i > x; i--) > array[i+1] = array[i]; > But this is too slow. How can I do it copying directly from memory to memory? When > I want to move a part of an array back, I'm using: > memcpy(&numbers[5], &numbers[7], n*sizeof(int)); Calling memcpy() when the source and destination memory areas overlap invokes undefined behavior. You should use memmove() instead. It has the same prototype like memcpy() but it is safe to use when the source and destination areas overlap. > instead of > for (i = x; i < size; i++) > array[i] = array[i+1]; > > Is there a backwards memcpy available? If not, what would be the fastest way? The documentation of memcpy() does not specify how bytes are copied from source to destination. And it does not need to as the source and destination objects must not overlap. So the notion of forward or backward version of memcpy() does not make any sense. On the other hand memmove() guarantees that the copying process takes place as if the source was copied to a temporary area that does not overlap with any of the parameters and then the object is copied from the temporary area back to the destination. How exactly this is achieved is a matter of implementation and a quality implementation should provide a version optimized for your particular system Hope this helps. Best regards Emil > Please note that the number of bytes to move ahead will not be constant... > > "There's never enough time to do all the nothing you want" Bill Watterson > Bruno Barberi Gnecco ICQ #1383173 - PGP 5.0i user > My other OS is Linux -=O=- Check my homepage at http://graphx.home.ml.org > >