Re: Double Indirection

From: Mike Wahler (mkwahler_at_mkwahler.net)
Date: 07/08/04

  • Next message: Russell Hanneken: "Re: structs and malloc [C]"
    Date: Thu, 08 Jul 2004 04:09:29 GMT
    
    

    "cpp072004" <cpp072004@yahoo.com> wrote in message
    news:b6568e3f.0407071936.77803575@posting.google.com...
    > Hello. Given the following code below, can anyone tell me why the
    > output from "rates" is correct, but the output from "yieldRates" is
    > incorrect?

    Your whole program is incorrect, it produces undefined
    behavior (gave 'illegal operation' error on my machine)

    > And if I needed to use double indirection (no pun
    > intended) how would I accomplish it?
    >
    > #include <iostream>
    >
    > using namespace std;
    >
    > void main()

    int main()

    {
    > double *rates = new double[2];
    >
    > rates[0] = 2.2f;
    > rates[1] = 3.33f;

    The array elements are type 'double'. Why are you using
    type 'float' initializers? It won't harm anything, but
    they'll be converted to 'double' anyway, so what's the point?

    >
    > cout << "rates [0] = " << rates[0] << endl;
    > cout << "rates [1] = " << rates[1] << endl;
    >
    > double **yieldRates = new double*[2];
    >
    > *yieldRates[0] = 1.2f;
    > *yieldRates[1] = 2.32f;

    Both of these statements yield :-) undefined behavior.
    You're trying to write to memory not owned by your program,
    and you're trying to assign a floating point value to a
    pointer.

    >
    > cout << "yieldRates [0] = " << *yieldRates[0] << endl;
    > cout << "yieldRates [1] = " << *yieldRates[1] << endl;

    Two more cases of undefined behavior.

    >
    > delete rates;
    > delete yieldRates;

    Yet two more cases of undefined behavior.

    > }
    >
    > yields:
    >
    > rates [0] = 2.2
    > rates [1] = 3.33
    > yieldRates [0] = 2.32
    > yieldRates [1] = 2.32

    It could yield anything (or nothing) at all, or
    anything in between.

    Carefully compare this with yours:

    #include <iostream>
    #include <ostream>

    using namespace std;

    int main()
    {
        double *rates = new double[2];

        rates[0] = 2.2f;
        rates[1] = 3.33f;

        cout << "rates [0] = " << rates[0] << endl;
        cout << "rates [1] = " << rates[1] << endl;

        double **yieldRates = new double*[2];
        yieldRates[0] = new double(1.2);
        yieldRates[1] = new double(2.32);

        cout << "yieldRates [0] = " << *(yieldRates[0]) << endl;
        cout << "yieldRates [1] = " << *(yieldRates[1]) << endl;

        delete[] rates;
        delete yieldRates[0];
        delete yieldRates[1];
        delete[] yieldRates;

        return 0; /* optional, but IMO 'good style' */
    }

    Finally, you needn't be messing around with arrays at all.
    Use containers.

    -Mike


  • Next message: Russell Hanneken: "Re: structs and malloc [C]"

    Relevant Pages

    • Re: ? Modeless Dialog: No OnInitDialog, No Template (No Controls)
      ... and therefore using it is incorrect. ... BOOL CDialog::Create ... int x, int y, int nWidth, int nHeight, ... HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam) ...
      (microsoft.public.vc.mfc)
    • Re: help w/ c/c++ problem
      ... Standard REQUIRES main to return an int. ... Then it is still incorrect. ... The function called at program startup is named main. ...
      (comp.lang.c)
    • Re: Segmentation fault when compiled binary is executed
      ... int mainisn't incorrect, ... Ending mainwith a call to exitisn't incorrect ... Casting the return value of malloc() is ... you might read the C FAQ along with the resource you cited: ...
      (comp.lang.c)
    • Re: Problems with Harbison & Steele
      ... > Yesterday I embarrassed myself on sci.crypt with some incorrect C ... and mapping characters.166) In all cases the argument is an int, ... value of which shall be representable as an unsigned char or shall equal ... The function takes an int as input, but the value should either be EOF ...
      (comp.lang.c)