tags:

views:

90

answers:

3

I trying to allocate memory for 10 bytes

BYTE* tmp;
tmp = new BYTE[10];
//or tmp = (BYTE*)malloc(10*sizeof(BYTE));

But after new or malloc operation length of *tmp more than 10 (i.e. '\0' char not in 10 position in tmp array)

Why?

+9  A: 

Neither new[] nor malloc() will place the \0 for you. When you call malloc() or new[] for char the block is unitilialized - you need to initialize it manually - either put \0 into the last element, or use memset() for the entire block.

sharptooth
There is one more way to initialize array with 0: new BYTE[10](). See my answer for details.
Sergey Teplyakov
+4  A: 

There is no reason for '\0' to be at the end of the array.

malloc (or new, for that matter), gives you back a block of 10 bytes, which is memory it allocated for you. It's your job to do whatever you want with this memory.

You're probably getting mixed up with a string (like char[10], for example).

The whole idea of a string is to be an array of bytes, but which ends with '\0' to denote its size.

An array of bytes, or any other array you allocate which isn't a string, won't neceassrily end with '\0'; it's your job to keep track of its size.

Edan Maor
+1  A: 

First, BYTE array can contains zeros, thats why you can't use strlen to determine array length.

Second, after calling new BYTE[10] your arrray remains uninitalized (contains garbage) if you want automaticly initalize array with 0 you can use the following code:

BYTE* tmp2;
tmp2 = new BYTE[10]();

But even in this case you can't use strlen, because strlen returns 0.

You must save array length into some variable or simply use std::vector instead.

Sergey Teplyakov