Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C memory overlap?

I am trying to copy the first 16 bytes of a 32 byte string to dest.

unsigned char src[32] = "HELLO-HELLO-HELLO-HELLO-HELLO-12";
unsigned char dest[16];

memcpy(dest, src, 16); // COPY

printf("%s\n", src);
printf("%lu\n", strlen(src));

printf("%s\n", dest);
printf("%lu\n", strlen(dest));

The output is the following

HELLO-HELLO-HELLO-HELLO-HELLO-12
32
HELLO-HELLO-HELLHELLO-HELLO-HELLO-HELLO-HELLO-12
48

I was expecting to receive HELLO-HELLO-HELL in dest only. The first 16 bytes of dest actually contain the expected result.

Why does dest more than it can actually hold? Why does it have a length of 16+32=48? Is there a way to copy only the first 16 bytes of src to dest?

like image 307
desktop Avatar asked Jul 04 '26 17:07

desktop


2 Answers

The 16 bytes allocated for dest need to include a byte for the trailing NULL ('\0') -- since you wrote 16 bytes, you have a non-null terminated string.

Since the computer you are on has the stack organized in a particular way, you are proceeding past the end of dest and then printing src.

So, to copy 16 bytes, allocate 17 to leave room for the trailing null, and initialize it.

unsigned char dest[17]={0};

Alternative, after copying it, null terminate it:

memcpy(dest, src, 16); // COPY
dest[16]='\0';
like image 99
JohnH Avatar answered Jul 07 '26 07:07

JohnH


You're not accounting for the fact that strings are null terminated. There is a '\0'character at the end of the "HELLO..." string constant. Take a look at

http://www.tutorialspoint.com/c_standard_library/c_function_strncpy.htm

That should point you in the right direction. memcpy doesn't provide help for C Strings - just raw memory.

like image 20
KirkSpaziani Avatar answered Jul 07 '26 06:07

KirkSpaziani



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!