Memory Leak where?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • MathewLovesC

    Memory Leak where?

    Can someone help me out here? I have a bunch of test statements in the
    program and my test printf("Do I have trouble here after
    GetNumbers()?\n "); does not display rather I get garbage. Please help.

    #include <stdio.h>
    #include <system.h>

    //prototypes
    char DisplayTitle(vo id);
    void GetNumbers(int *parrNumb);
    int FindMax(int *parrNumb);
    int FindMin(int *parrNumb);
    void DisplayNumbers( int min, int max);

    int main(void)
    {
    char quitNow='a'; /* to determine if uer wants to quit */
    int min=0; /* minimum number in array */
    int max=0; /* maximum number in array */
    int arrNumb[10]; /* user input into array */
    int *parrNumb; /* pointer to array */
    int i=0; /* used as a counter in array */

    for (i=0; i<10; i++) /* initialize array to 0's */
    arrNumb[i] = 0;

    //display the title of the program
    quitNow = DisplayTitle();

    if (quitNow=='Q' || quitNow=='q')
    {
    return 0;
    }

    //printf("Do I have trouble here before GetNumbers()?\n ");
    //Get all 10 numbers from user
    GetNumbers(arrN umb[10]);

    printf("Do I have trouble here after GetNumbers()?\n ");

    //Find minimum number in array
    min = FindMin(arrNumb[10]);
    printf("\nmin is: %i",min);
    //Find maximum number in array
    max = FindMax(arrNumb[10]);

    printf("\nmin is: %i",min);
    printf("\nmax is: %i",max);
    printf("Do I have trouble here before DisplayNumbers( )?\n");
    //display the output
    DisplayNumbers( min, max);
    printf("Do I have trouble here after DisplayNumbers( )?\n");

    fflush(stdin);
    printf("\nPress any key to end.");
    getche();
    return 0;
    }

    /* DisplayTitle Function
    Input : Non
    Process: Displays Title and Instructions
    Output : None
    */
    char DisplayTitle(vo id)
    {
    char quitNow; /* does user want to exit program */

    clrscr();
    printf("Array Program\n");
    printf("-----------------------------------------------------------------\n");
    printf("Applica tion will ask for 10 numbers and then return the
    largest\nand smallest numbers.\n");
    printf("Enter (Q) to Quit Application or press any other key to
    continue.\n");
    printf("-----------------------------------------------------------------\n");
    scanf("%c",&qui tNow);
    fflush(stdin);
    return quitNow;
    }


    /* GetNumbers Function
    Input : Array of integers
    Process: Get user's input (up to 10 times)
    Output : None. Values returned through pointer
    */
    void GetNumbers(int *parrNumb)
    {
    int getnumb=0; /* user choice from menu passed to main */
    int count; /* used to determine when 10 numbers added */

    for(count=0;cou nt<10;count++)
    {
    printf("Please enter a number.\n");
    scanf("%d",parr Numb);
    fflush(stdin);
    printf("GetNumb er is : %d\n",*parrNumb );
    printf("INDEX IS %i\n",count);

    *parrNumb++;

    getnumb=0; /*reinitialize*/

    }

    }


    /* FindMax Function
    Input : Pointer to array
    Process: Finds maximum number in array
    Output : Returns maximum number
    */
    int FindMax(int *parrNumb)
    {
    int maxNumb=0; /* used to store maximum number of array */
    int i=0; /* used as a counter for the array */

    maxNumb = *parrNumb;

    for (i=1; i<10; i++) /* initialize array to 0's */
    {
    *parrNumb++; /* go to next index */

    if (*parrNumb>maxN umb)
    {
    maxNumb = *parrNumb;
    }

    }

    return maxNumb;
    }


    /* FindMin Function
    Input : Pointer to array
    Process: Finds minimum number in array
    Output : Returns minimum number
    */
    int FindMin(int *parrNumb)
    {
    int minNumb=0; /* used to store minimum number of array */
    int i=0; /* used as a counter for the array */

    minNumb = *parrNumb; /* assign first index to minNumb */

    for (i=1; i<10; i++) /* initialize array to 0's */
    {
    *parrNumb++; /* go to next index */

    if (*parrNumb<minN umb)
    {
    minNumb = *parrNumb;
    }

    }

    return minNumb;
    }


    /* DisplayNumbers Function
    Input : Minimum number in array and maximum number in array
    Process: Displays minimum and maximum numbers
    Output : None
    */
    void DisplayNumbers( int min, int max)
    {
    //clrscr();
    printf("\nThe minimum number in the array is %i.",min);
    printf("\nThe maximum number in the array is %i.",max);
    }
  • Jason

    #2
    Re: Memory Leak where?


    MathewLovesC wrote:[color=blue]
    > Can someone help me out here? I have a bunch of test statements in[/color]
    the[color=blue]
    > program and my test printf("Do I have trouble here after
    > GetNumbers()?\n "); does not display rather I get garbage. Please[/color]
    help.

    <main() snipped!>
    [color=blue]
    > /* GetNumbers Function
    > Input : Array of integers
    > Process: Get user's input (up to 10 times)
    > Output : None. Values returned through pointer
    > */
    > void GetNumbers(int *parrNumb)
    > {
    > int getnumb=0; /* user choice from menu passed to main */
    > int count; /* used to determine when 10 numbers added */
    >
    > for(count=0;cou nt<10;count++)
    > {
    > printf("Please enter a number.\n");
    > scanf("%d",parr Numb);
    > fflush(stdin);
    > printf("GetNumb er is : %d\n",*parrNumb );
    > printf("INDEX IS %i\n",count);
    >
    > *parrNumb++;[/color]

    This statement is NOT moving the pointer parrNumb to the next address.
    Rather, it is incrementing the integer value of *parrNumb by one. For
    pointer arithmetic, simply use parrNumb++.
    [color=blue]
    >
    > getnumb=0; /*reinitialize*/
    >
    > }
    >
    > }[/color]

    The remaining functions (<snipped!>) are all showing the same error.
    Fix these and The program should behave a little sensibly.

    -Jason

    Comment

    • Jason

      #3
      Re: Memory Leak where?


      MathewLovesC wrote:[color=blue]
      > Can someone help me out here? I have a bunch of test statements in[/color]
      the[color=blue]
      > program and my test printf("Do I have trouble here after
      > GetNumbers()?\n "); does not display rather I get garbage. Please[/color]
      help.

      <snip>
      [color=blue]
      > void GetNumbers(int *parrNumb);[/color]

      <snip>
      [color=blue]
      > int main(void)
      > {
      > char quitNow='a'; /* to determine if uer wants to quit */
      > int min=0; /* minimum number in array */
      > int max=0; /* maximum number in array */
      > int arrNumb[10]; /* user input into array */[/color]

      <snip>
      [color=blue]
      > GetNumbers(arrN umb[10]);[/color]

      Here you are passing the value array element 10 (which, btw, is just
      _past_ the boundary of this array) as the pointer argument to your
      function. You might see a warning similar to "passing arg 1 of
      `GetNumbers' makes pointer from integer without a cast" from your
      compiler.

      What you really want to do is simply type GetNumbers(arrN umb).

      Previously I stated that *parrNumb++ was incorrect. I was only
      partially correct. The ++ is higher precedence that the *, so this
      actually _was_ working correctly. However, there is no need to
      dereference this since you aren't doing anything with the value.

      -Jason

      Comment

      • Keith Thompson

        #4
        Re: Memory Leak where?

        sasha_mathew@ho tmail.com (MathewLovesC) writes:[color=blue]
        > Can someone help me out here? I have a bunch of test statements in the
        > program and my test printf("Do I have trouble here after
        > GetNumbers()?\n "); does not display rather I get garbage. Please help.
        >
        > #include <stdio.h>
        > #include <system.h>[/color]

        There is no standard header called <system.h>. There may be a
        system-specific one but I don't see any strong need to use any
        non-portable constructs in your code.

        [...][color=blue]
        > void GetNumbers(int *parrNumb);[/color]
        [...][color=blue]
        >
        > int main(void)
        > {[/color]
        [...][color=blue]
        > int arrNumb[10]; /* user input into array */[/color]
        [...][color=blue]
        > GetNumbers(arrN umb[10]);[/color]

        arrNumb[10] is an expression of type int; you're passing it as an
        argument of type int*. You're also accessing an element past the end
        of the array. You probably want

        GetNumbers(arrN umb);

        which passes the base address of your array.
        [color=blue]
        > printf("Do I have trouble here after GetNumbers()?\n ");
        >
        > //Find minimum number in array
        > min = FindMin(arrNumb[10]);[/color]

        See above.
        [color=blue]
        > printf("\nmin is: %i",min);
        > //Find maximum number in array
        > max = FindMax(arrNumb[10]);[/color]

        See above.

        [snip]
        [color=blue]
        > fflush(stdin);[/color]

        This invokes undefined behavior. See question 12.26 in the C FAQ,
        <http://www.eskimo.com/~scs/C-faq/top.html>. You do this several
        times; I won't point out the other instances.
        [color=blue]
        > printf("\nPress any key to end.");[/color]

        This would be a good place for fflush(stdout); otherwise the output
        may not appear until you print a newline character (stdout may be
        line-buffered).
        [color=blue]
        > getche();[/color]

        No such function in standard C. The program should end on its own
        even if you don't wait for user input. If you have some reason to
        wait for user input (say, because the OS will close the window
        containing your output), you can do it with a standard function like
        getchar() (though that probably won't return until you enter a
        newline).

        [snip]
        [color=blue]
        > clrscr();[/color]

        This is a non-standard function.

        Why do you want to clear the screen anyway? It's up to you, but if I
        run your program I might have important information on my screen; if
        you erase it without a very good reason I'll be annoyed.

        [snip]
        [color=blue]
        > void DisplayNumbers( int min, int max)
        > {
        > //clrscr();
        > printf("\nThe minimum number in the array is %i.",min);
        > printf("\nThe maximum number in the array is %i.",max);
        > }[/color]

        The "%i" format is equivalent to the "%d" format. I'm not sure why
        they both exist. I always use "%d" rather than "%i" myself.

        I notice your printfs tend to have the newline at the beginning rather
        than at the end. Why?

        The errors I've pointed out probably aren't the only ones in your
        program.

        Several of these errors should have been caught by your compiler, at
        least as warnings. If they weren't, you should increase the warning
        level on your compiler. If they were, you really should pay attention
        to what your compiler tells you.

        --
        Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
        San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
        We must do something. This is something. Therefore, we must do this.

        Comment

        • Minti

          #5
          Re: Memory Leak where?


          MathewLovesC wrote:[color=blue]
          > Can someone help me out here? I have a bunch of test statements in[/color]
          the[color=blue]
          > program and my test printf("Do I have trouble here after
          > GetNumbers()?\n "); does not display rather I get garbage. Please[/color]
          help.[color=blue]
          >
          > #include <stdio.h>
          > #include <system.h>
          >
          > //prototypes
          > char DisplayTitle(vo id);
          > void GetNumbers(int *parrNumb);
          > int FindMax(int *parrNumb);
          > int FindMin(int *parrNumb);
          > void DisplayNumbers( int min, int max);
          >
          > int main(void)
          > {
          > char quitNow='a'; /* to determine if uer wants to quit */
          > int min=0; /* minimum number in array */
          > int max=0; /* maximum number in array */
          > int arrNumb[10]; /* user input into array */
          > int *parrNumb; /* pointer to array */
          > int i=0; /* used as a counter in array */
          >
          > for (i=0; i<10; i++) /* initialize array to 0's */
          > arrNumb[i] = 0;
          >
          > //display the title of the program
          > quitNow = DisplayTitle();
          >
          > if (quitNow=='Q' || quitNow=='q')
          > {
          > return 0;
          > }
          >
          > //printf("Do I have trouble here before GetNumbers()?\n ");
          > //Get all 10 numbers from user
          > GetNumbers(arrN umb[10]);
          >
          > printf("Do I have trouble here after GetNumbers()?\n ");
          >
          > //Find minimum number in array
          > min = FindMin(arrNumb[10]);
          > printf("\nmin is: %i",min);
          > //Find maximum number in array
          > max = FindMax(arrNumb[10]);
          >
          > printf("\nmin is: %i",min);
          > printf("\nmax is: %i",max);
          > printf("Do I have trouble here before DisplayNumbers( )?\n");
          > //display the output
          > DisplayNumbers( min, max);
          > printf("Do I have trouble here after DisplayNumbers( )?\n");
          >
          > fflush(stdin);
          > printf("\nPress any key to end.");
          > getche();
          > return 0;
          > }
          >
          > /* DisplayTitle Function
          > Input : Non
          > Process: Displays Title and Instructions
          > Output : None
          > */
          > char DisplayTitle(vo id)
          > {
          > char quitNow; /* does user want to exit program */
          >
          > clrscr();
          > printf("Array Program\n");
          >[/color]
          printf("-----------------------------------------------------------------\n");[color=blue]
          > printf("Applica tion will ask for 10 numbers and then return the
          > largest\nand smallest numbers.\n");
          > printf("Enter (Q) to Quit Application or press any other key to
          > continue.\n");
          >[/color]
          printf("-----------------------------------------------------------------\n");[color=blue]
          > scanf("%c",&qui tNow);
          > fflush(stdin);
          > return quitNow;
          > }
          >
          >
          > /* GetNumbers Function
          > Input : Array of integers
          > Process: Get user's input (up to 10 times)
          > Output : None. Values returned through pointer
          > */
          > void GetNumbers(int *parrNumb)
          > {
          > int getnumb=0; /* user choice from menu passed to main */
          > int count; /* used to determine when 10 numbers added */
          >
          > for(count=0;cou nt<10;count++)
          > {
          > printf("Please enter a number.\n");
          > scanf("%d",parr Numb);
          > fflush(stdin);[/color]
          ^^^^^^^^^^^^

          Are you sure this is doing what's expected? Remove this statement.

          <snip>

          Comment

          • pete

            #6
            Re: Memory Leak where?

            MathewLovesC wrote:[color=blue]
            >
            > Can someone help me out here? I have a bunch of test statements in the
            > program and my test printf("Do I have trouble here after
            > GetNumbers()?\n "); does not display rather I get garbage. Please help.[/color]

            Keith Thompson's remarks were on the money.
            You almost had it. Try this:

            /* BEGIN new.c */

            #include <stdio.h>

            char DisplayTitle(vo id);
            void GetNumbers(int *parrNumb);
            int FindMax(int *parrNumb);
            int FindMin(int *parrNumb);
            void DisplayNumbers( int min, int max);

            int main(void)
            {
            char quitNow='a'; /* to determine if uer wants to quit */
            int min=0; /* minimum number in array */
            int max=0; /* maximum number in array */
            int arrNumb[10]; /* user input into array */
            int i=0; /* used as a counter in array */

            for (i=0; i<10; i++) { /* initialize array to 0's */
            arrNumb[i] = 0;
            }
            quitNow = DisplayTitle();

            if (quitNow=='Q' || quitNow=='q') {
            return 0;
            }
            GetNumbers(arrN umb);
            min = FindMin(arrNumb );
            printf("\nmin is: %i",min);
            max = FindMax(arrNumb );
            printf("\nmax is: %i",max);
            DisplayNumbers( min, max);
            return 0;
            }

            /* DisplayTitle Function
            Input : Non
            Process: Displays Title and Instructions
            Output : None
            */
            char DisplayTitle(vo id)
            {
            char quitNow; /* does user want to exit program */

            printf("Array Program\n");

            printf("-----------------------------------------------------------------\n");
            printf("Applica tion will ask for 10 numbers and then return the"
            "largest\na nd smallest numbers.\n");
            printf("Enter (Q) to Quit Application or press any other key to"
            "continue.\ n");

            printf("-----------------------------------------------------------------\n");
            scanf("%c", &quitNow);
            return quitNow;
            }


            /* GetNumbers Function
            Input : Array of integers
            Process: Get user's input (up to 10 times)
            Output : None. Values returned through pointer
            */
            void GetNumbers(int *parrNumb)
            {
            int getnumb=0; /* user choice from menu passed to main */
            int count; /* used to determine when 10 numbers added */

            for(count=0;cou nt<10;count++) {
            printf("Please enter a number.\n");
            scanf("%d",parr Numb);
            printf("GetNumb er is : %d\n",*parrNumb );
            printf("INDEX IS %i\n",count);
            *parrNumb++;
            getnumb=0; /*reinitialize*/
            }
            }


            /* FindMax Function
            Input : Pointer to array
            Process: Finds maximum number in array
            Output : Returns maximum number
            */
            int FindMax(int *parrNumb)
            {
            int maxNumb=0; /* used to store maximum number of array */
            int i=0; /* used as a counter for the array */

            maxNumb = *parrNumb;

            for (i=1; i<10; i++) /* initialize array to 0's */
            {
            *parrNumb++; /* go to next index */

            if (*parrNumb>maxN umb)
            {
            maxNumb = *parrNumb;
            }

            }

            return maxNumb;
            }


            /* FindMin Function
            Input : Pointer to array
            Process: Finds minimum number in array
            Output : Returns minimum number
            */
            int FindMin(int *parrNumb)
            {
            int minNumb=0; /* used to store minimum number of array */
            int i=0; /* used as a counter for the array */

            minNumb = *parrNumb; /* assign first index to minNumb */

            for (i=1; i<10; i++) /* initialize array to 0's */
            {
            *parrNumb++; /* go to next index */

            if (*parrNumb<minN umb)
            {
            minNumb = *parrNumb;
            }

            }

            return minNumb;
            }


            /* DisplayNumbers Function
            Input : Minimum number in array and maximum number in array
            Process: Displays minimum and maximum numbers
            Output : None
            */
            void DisplayNumbers( int min, int max)
            {
            printf("\nThe minimum number in the array is %i.\n",min);
            printf("The maximum number in the array is %i.\n",max);
            }

            /* END new.c */


            --
            pete

            Comment

            • Keith Thompson

              #7
              Re: Memory Leak where?

              "Minti" <imanpreet@gmai l.com> writes:[color=blue]
              > MathewLovesC wrote:[/color]
              [snip about 100 lines][color=blue][color=green]
              >> fflush(stdin);[/color]
              > ^^^^^^^^^^^^
              >
              > Are you sure this is doing what's expected? Remove this statement.[/color]

              There's no need to quote that much context to point out a single
              self-contained error.

              Also, fflush(stdin) does invoke undefined behavior, but realistically
              it's unlikely to cause a memory leak.

              --
              Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
              San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
              We must do something. This is something. Therefore, we must do this.

              Comment

              Working...