Creating an array in the heap
              
              If you want to use an array after the function that created
              it returns, allocate that array in the heap, not in the 
              run-time stack.  Expression new T[size]
              allocates a new array with size variables in it,
              each of type T.  Remember that an array is treated
              just like a pointer to the first thing in the array.
              So expression new int[25] has type int*.  Statement
int* A = new int[25];allocates a new array of 25 ints and stores a pointer to the first one into variable A. The size can be given by any expression that yields an integer. For example, if you already have an integer variable called n that currently holds 50, then double* B = new double[n];allocates an array of 50 doubles.  | 
          
Watch out: new int(25)
| To allocate an array, use square brackets around the size. Unfortunately, expression new int(25) allocates one variable and stores 25 in it. That is really not a good language feature, but we have to live with it and watch out for it. | 
delete [ ] p;
| If you allocate an array (using brackets with new), then, when you delete that array, write an empty set of square brackets after delete. It is up to you to know whether you are deallocating an array of just one thing. | 
Watch out: delete an entire array
| Never try to delete just a part of an array. Your only option is to delete the entire array. If you try to delete part of an array, you will corrupt the heap manager. | 
Watch out: never delete an array that is in the run-time stack
              
              You only delete an array that is in the heap.  If you do
int A[100]; ... delete [] A;you will corrupt the heap manager.  | 
          
Watch out: do not misuse the run-time stack
              
              Consider the following attempt to allocate an array.
  int* allocArr(int n)
  {
    int A[n];
    return A;
  }
              The compiler will not give you an error on this.  A is
              an array of integers (type int*), so the correct type of
              thing is returned.  But the returned pointer is pointing
              into the stack frame of allocArr.  As soon as allocArr
              returns, that becomes a
              dangling pointer.
              To allocate
              an array that you need to keep using after the function
              returns, use new.
              
             | 
          
Allocating an array in C
              
              To allocate an array in the heap in a C program, where new
              is not available, use malloc, and compute the number of bytes that
              are needed.  For example, C statement
int* A = (int*) malloc(n*sizeof(int));is roughly equivalent to C++ statement int* A = new int[n];  | 
          
Write a statement that allocates a new array of 75 characters called frog. The new array should be in the heap. Answer
There is something wrong with the following function. Explain what is wrong.
  // makeZeroedArray(n) returns an array with
  // n items, all set to 0.
  int* makeZeroedArray(int n)
  {
    int A[n];
    for(int i = 0; i < n; i++)
    {
       A[i] = 0;
    }
    return A;
  }
          
          Answer
        There is something wrong with the following function. Explain what is wrong.
  // makeZeroedArray(n) returns an array with
  // n items, all set to 0.
  int* makeZeroedArray(int n)
  {
    int* A = new int(n);
    for(int i = 0; i < n; i++)
    {
       A[i] = 0;
    }
    return A;
  }
          
          Answer
        double* A = new double[m];If you are done with array A and want to return it to the heap manager, what statement should you use? Answer
The following function tries to read up to 100 integers from the standard input. So it allocates an array of size 100. But that is wasteful if you only actually read a few integers before hitting the end of the file. So this function decides to give the unused portion of the array back to the heap manager. Does that work?
  int* readInts()
  {
    int* A = new int[100];
    int i;
    for(i = 0; i < 100; i++)
    {
      int k = scanf("%i", &(A[i]));
      if(k != 1)
      {
        break;
      }
    }
    if(i < 100)
    {
      delete [] A + i;
    }
    return A;
  }
          
          Answer
        Function readInts() above wants to read some numbers and return an array containing them. If the bad part is removed from it, how would its caller know how many integers were read? Answer
What is the type of expression new long[12]? Answer
There is something wrong with the following function. Explain what is wrong.
  // makeZeroedArray(n) returns an array with
  // n items, all set to 0.
  int* makeZeroedArray(int n)
  {
    int* p = new int[n];
    for(int i = 0; i < n; i++)
    {
       p[i] = 0;
    }
    delete [] p;
    return p;
  }
          
          Answer