Memory Leak where?

M

MathewLovesC

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(void);
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 = 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(arrNumb[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(void)
{
char quitNow; /* does user want to exit program */

clrscr();
printf("Array Program\n");
printf("-----------------------------------------------------------------\n");
printf("Application 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",&quitNow);
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;count<10;count++)
{
printf("Please enter a number.\n");
scanf("%d",parrNumb);
fflush(stdin);
printf("GetNumber 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>maxNumb)
{
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<minNumb)
{
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);
}
 
J

Jason

MathewLovesC said:
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.

/* 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;count<10;count++)
{
printf("Please enter a number.\n");
scanf("%d",parrNumb);
fflush(stdin);
printf("GetNumber is : %d\n",*parrNumb);
printf("INDEX IS %i\n",count);

*parrNumb++;

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++.
getnumb=0; /*reinitialize*/

}

}

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

-Jason
 
J

Jason

MathewLovesC said:
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.

void GetNumbers(int *parrNumb);

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 */

GetNumbers(arrNumb[10]);

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(arrNumb).

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
 
K

Keith Thompson

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>

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.

[...]
void GetNumbers(int *parrNumb); [...]

int main(void)
{ [...]
int arrNumb[10]; /* user input into array */ [...]
GetNumbers(arrNumb[10]);

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(arrNumb);

which passes the base address of your array.
printf("Do I have trouble here after GetNumbers()?\n");

//Find minimum number in array
min = FindMin(arrNumb[10]);

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

See above.

[snip]
fflush(stdin);

This invokes undefined behavior. See question 12.26 in the C FAQ,
printf("\nPress any key to end.");

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).
getche();

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]
clrscr();

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]
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);
}

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.
 
M

Minti

MathewLovesC said:
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(void);
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 = 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(arrNumb[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(void)
{
char quitNow; /* does user want to exit program */

clrscr();
printf("Array Program\n");
printf("-----------------------------------------------------------------\n");
printf("Application 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",&quitNow);
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;count<10;count++)
{
printf("Please enter a number.\n");
scanf("%d",parrNumb);
fflush(stdin);

^^^^^^^^^^^^

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

<snip>
 
P

pete

MathewLovesC said:
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.

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

/* BEGIN new.c */

#include <stdio.h>

char DisplayTitle(void);
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 = 0;
}
quitNow = DisplayTitle();

if (quitNow=='Q' || quitNow=='q') {
return 0;
}
GetNumbers(arrNumb);
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(void)
{
char quitNow; /* does user want to exit program */

printf("Array Program\n");

printf("-----------------------------------------------------------------\n");
printf("Application 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", &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;count<10;count++) {
printf("Please enter a number.\n");
scanf("%d",parrNumb);
printf("GetNumber 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>maxNumb)
{
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<minNumb)
{
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 */
 
K

Keith Thompson

Minti said:
MathewLovesC wrote: [snip about 100 lines]
fflush(stdin);
^^^^^^^^^^^^

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

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,161
Messages
2,570,892
Members
47,432
Latest member
GTRNorbert

Latest Threads

Top