Re: byte copy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Oct 19, 2014 at 11:42:26PM +0200, Bogdan Cristea wrote:
> 
> > On 19 Oct 2014, at 23:32, John de la Garza <john@xxxxxxxxx> wrote:
> > 
> > Can anone see why these two pieces of code would behave differently?
> > They are used in a mergesort merge
> > 
> > the top one ends up with c (cp points to an offset in c)
> > 1 2 3 1
> > 
> > the bottom one (not commented out)
> > results in 1 2 3 4 (correct)
> > 
> >        /*
> >        if (alen == 0)
> >                memcpy(cp, bp, blen);
> >        else if (blen == 0){
> >                memcpy(cp, ap, alen);
> >        }
> >        */
> >        if (alen == 0)
> >                while (blen--)
> >                        *cp++ = *bp++;
> >        else
> >                while (alen--)
> >                        *cp++ = *ap++;
> > 
> > 
> > if you want to read it with more context see below
> > ---------------------------------------------------
> > 
> > #include <stdio.h>
> > #include <string.h>
> > #include <stdlib.h>
> > 
> > void pr_array(int *a, int len)
> > {
> > 	int i;
> > 	for (i = 0; i < len; i++)
> > 		printf("%d ", a[i]);
> > 	printf("\n");
> > }
> > void merge(int *a, int alen, int *b, int blen, int *c)
> > {
> > 	int *ap = a;
> > 	int *bp = b;
> > 	int *cp = c;
> > 
> > 	while (alen && blen) {
> > 		if (*ap <= *bp) {
> > 			*cp++ = *ap++;
> > 			alen--;
> > 		} else{
> > 			*cp++ = *bp++;
> > 			blen--;
> > 		}
> > 	}
> > 	if (alen == 0)
> > 		memcpy(cp, bp, blen);
> > 	else if (blen == 0){
> > 		memcpy(cp, ap, alen);
> > 	}
> > 	/*
> > 	if (alen == 0)
> > 		while (blen--)
> > 			*cp++ = *bp++;
> > 	else
> > 		while (alen--)
> > 			*cp++ = *ap++;
> > 	*/
> > }
> > 
> > void msort(int *arr, int len)
> > {
> > 	int mid = len / 2;
> > 	int llen = mid;
> > 	int rlen = len - mid;
> > 	int *l = malloc(llen);
> > 	int *r = malloc(rlen);
> > 	int i;
> > 
> > 	if (len <= 1)
> > 		return;	
> > 	for (i = 0; i < llen; i++)
> > 		l[i] = arr[i];
> > 	for (i = mid; i < mid + rlen; i++)
> > 		r[i-mid] = arr[i];
> > 	msort(l, llen);
> > 	msort(r, rlen);
> > 	merge(l, llen, r, rlen, arr);
> > 	free(l);
> > 	free(r);
> > }
> > int main()
> > {
> > 	int arr[] = {4,3, 2, 1};
> > 	int len = sizeof(arr) /sizeof(int);
> > 	int x[] = {1,3,5,7};
> > 	int y[] = {2,4,6,8};
> > 
> > 	msort(arr, len);
> > 	pr_array(arr, len);
> > 	return(0);
> > }
> 
> memcpy does not work for overlapping memory, use memmove instead
> 
Where does it overlap?  I found a big problem, I was passing in size
instead of size * sizeof(int).
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux