SeniorLee
SeniorLee

Reputation: 815

Allocating memory by size zero in c++?

int a = 10;
int *p = new int[0];

p = &a;
cout << *p << endl;

In c++, what happens if allocate memory size by zero?

after allocation I get valid memory pointer, and prints valid number.

But I think new operator should return something like FAILD or NULL.

Can anybody explain detail?

Upvotes: 0

Views: 1449

Answers (5)

Loki Astari
Loki Astari

Reputation: 264441

In c++, what happens if allocate memory size by zero?

A zero sized array is valid.
You just can't de-reference any members.

This is why the Greeks spent such a long time debating it thinking about zero as a number. But we can thank India at its great minds for eventually bringing zero as a number 0. It took them forever and aren't we glad they did, a lot of modern maths would not be possible without such a unique value.

after allocation I get valid memory pointer,

That is correct.
If it failed it would throw an exception.

and prints valid number.

Your assignment: p = &a; is probably not what you want. As this just leaks memory and set p to point at the variable a. What you were probably trying to do is:

(*p) = a;
// or
p[0] = a;

This is undefined behavior.
As you are assigning to values after the end of the array.

But I think new operator should return something like FAILD or NULL.

No.

Can anybody explain detail?

Yes.

Upvotes: 2

Mark Tolonen
Mark Tolonen

Reputation: 177715

From ISO/IEC 14882:2003(E), 5.3.4.7

When the value of the expression in a direct-new-declarator is zero, the allocation function is called to allocate an array with no elements.

So you get a valid pointer, but you can't dereference it, and must still delete[] it.

Upvotes: 1

Mahesh
Mahesh

Reputation: 34625

From ISO/IEC 14882:2003(E), 5.3.4.6

Every constant-expression in a direct-new-declarator shall be an integral constant expression (5.19) and evaluate to a strictly positive value. The expression in a direct-new-declarator shall have integral or enu- meration type (3.9.1) with a non-negative value. [Example: if n is a variable of type int, then new float[n][5] is well-formed (because n is the expression of a direct-new-declarator), but new float[5][n] is ill-formed (because n is not a constant-expression). If n is negative, the effect of new float[n][5] is undefined.]

They are intelligent. Can zero be considered as non-negative value ? Might be yes, since it is compiling with no problems, I guess.

Upvotes: 1

orlp
orlp

Reputation: 117691

You assign the pointer "p" at the chunk of "a" so p doesn't point to the zero size chunk anymore when you print it.

Upvotes: 1

Anon.
Anon.

Reputation: 59983

after allocation I get valid memory pointer, and prints valid number.

Your provided code doesn't actually test this.

When you do p = &a, you're reassigning p to point somewhere completely different. Whatever it held before is irrelevant to the continued execution of the program.

Upvotes: 3

Related Questions