954,499 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

pointer passing problem

I am a new guy in C. But I have read stuffs about Malloc, Realloc, how to pass pointers to the function...

If I am writing this code in single program, it works perfectly...but smart programmmer guide says write in compact form.

So with user defined function this is not giving me desired output. I dont know what mistake I am going in this simple program.

*pointer takes all the values correctly in function resize_long_pointer(...), but when it comes to main function it is not working..even it is crashing with large number for N_Cell_total....

Please Help me regarding this problem

Hear is my programe....

Code:

#include <stdafx.h>
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <stdlib.h>

void main()
{
	size_t size;
	long *CF5,i;
	long N_Cell_total;

	void resize_long_pointer(long *,long *);

	N_Cell_total = 1;

	CF5 = (long *)malloc((N_Cell_total + 2) * sizeof(long));

	for(i=1;i<=N_Cell_total;i++)
	{
		CF5[i] = i;
		printf("\ntest1 %ld",CF5[i]);
	}

	N_Cell_total = 20000;

	resize_long_pointer(CF5,&N_Cell_total);

	for(i=1;i<=N_Cell_total;i++)
	{
		printf("\ntest2 i %ld CF5 %ld",i,CF5[i]);
	}

}

void resize_long_pointer(long *pointer,long *add_size)
{
	long int_tmp,i;
	size_t size;

	int_tmp = *add_size;

	printf("\nAdditional size :: %ld",int_tmp);
 
	if( (pointer = (long *) realloc( pointer, (int_tmp + 2) * sizeof(long) )) == NULL)
		 printf("\nPointer resizing problem :: add_size : %ld",*add_size);
 
	for(i=1;i<= int_tmp;i++)
	{
		*pointer = i;
	}

	printf("\ntest2 pointer[%ld] %ld ",i-1,pointer[i-1]);
}

output::

Code:

test1 1
Additional size :: 100
function test1 i 1 pointer 1
function test1 i 2 pointer 2
.......
function test1 i 3 pointer 100
test2 pointer[100] 100
test2 i 1 CF5 1
test2 i 2 CF5 -842150451
test2 i 3 CF5 -33686019
.......
test2 i 100 CF5 43807

umeshjaviya
Newbie Poster
3 posts since May 2008
Reputation Points: 10
Solved Threads: 0
 

line 27, you have to pass the pointer CF5 by reference, you are only passing it by value. I only show the corrections to a few lines. Function resize_long_pointer() will require several other corrections to accommodate the double star (pointer to a pointer)

// line 13:
void resize_long_pointer(long **,long *);
...
// line 27
resize_long_pointer(&CF5,&N_Cell_total); 

// line 36
void resize_long_pointer(long **pointer,long *add_size)


Another option is to change resize_long_pointer() to return a pointer long * resize_long_pointer(long *,long *);

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

A couple of other notes:

- void main is evil . Don't use it.
- You shouldn't have your function prototype inside main(). Move line 13 to somewhere before main()

John A
Vampirical Lurker
Team Colleague
7,630 posts since Apr 2006
Reputation Points: 2,240
Solved Threads: 339
 

Hello Friends,

Thank you very much for your kind help......
The correctly working code is given below......
What I understand that .... user define functions can communicate with main function through pointers only...so when I need to pass pointer and its value then I need to pass pointer of pointer (**pointer) but not pointer (*pointer) only.

#include <stdafx.h>
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <stdlib.h>
void resize_long_pointer(long **,long *);

void main()
{
	size_t size;
	long *CF5,i;
	long N_Cell_total;

	

	N_Cell_total = 1;

	CF5 = (long *)malloc((N_Cell_total + 2) * sizeof(long));

	for(i=1;i<=N_Cell_total;i++)
	{
		CF5[i] = i;
		printf("\ntest1 %ld",CF5[i]);
	}

	N_Cell_total = 200000;

	resize_long_pointer(&CF5,&N_Cell_total);

	for(i=1;i<=N_Cell_total;i++)
	{
		printf("\ntest2 i %ld CF5 %ld",i,CF5[i]);
	}

}

void resize_long_pointer(long **pointer2,long *add_size)
{

	long int_tmp,i,*pointer;
	size_t size;


	int_tmp = *add_size;

	pointer = *pointer2;

	printf("\nAdditional size :: %ld",int_tmp);
 
	if( (pointer = (long *) realloc( pointer, (int_tmp + 2) * sizeof(long) )) == NULL)
		 printf("\nPointer resizing problem :: add_size : %ld",*add_size);
 
	for(i=1;i<= int_tmp;i++)
	{
		pointer[i] = i;
		//printf("\nfunction test1 i %ld pointer %ld",i,pointer[i]);
	}

	printf("\ntest2 pointer[%ld] %ld ",i-1,pointer[i-1]);

	*pointer2 = pointer;
}
umeshjaviya
Newbie Poster
3 posts since May 2008
Reputation Points: 10
Solved Threads: 0
 

The only reason to pass a pointer to a pointer is so that the function can change the value of the original pointer that was declared in main().

>>for(i=1;i<= int_tmp;i++)
That line is incorrect. arrays are numbered 0, 1, ... Here is the correction
for(i=0; i < int_tmp; i++)

>>for(i=1;i<=N_Cell_total;i++)
From your original post in main() -- that line is also wrong for the same reason for(i=0; i < N_Cell_total; i++)

And don't be afraid to make liberal use of white space, it make the code easier to read.

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

Hello Friends,

Thank you very much for your kind help...... The correctly working code is given below...... What I understand that .... user define functions can communicate with main function through pointers only...so when I need to pass pointer and its value then I need to pass pointer of pointer (**pointer) but not pointer (*pointer) only.

#include <stdafx.h>
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <stdlib.h>
void resize_long_pointer(long **,long *);

void main()
{
	size_t size;
	long *CF5,i;
	long N_Cell_total;

	

	N_Cell_total = 1;

	CF5 = (long *)malloc((N_Cell_total + 2) * sizeof(long));

	for(i=1;i<=N_Cell_total;i++)
	{
		CF5[i] = i;
		printf("\ntest1 %ld",CF5[i]);
	}

	N_Cell_total = 200000;

	resize_long_pointer(&CF5,&N_Cell_total);

	for(i=1;i<=N_Cell_total;i++)
	{
		printf("\ntest2 i %ld CF5 %ld",i,CF5[i]);
	}

}

void resize_long_pointer(long **pointer2,long *add_size)
{

	long int_tmp,i,*pointer;
	size_t size;


	int_tmp = *add_size;

	pointer = *pointer2;

	printf("\nAdditional size :: %ld",int_tmp);
 
	if( (pointer = (long *) realloc( pointer, (int_tmp + 2) * sizeof(long) )) == NULL)
		 printf("\nPointer resizing problem :: add_size : %ld",*add_size);
 
	for(i=1;i<= int_tmp;i++)
	{
		pointer[i] = i;
		//printf("\nfunction test1 i %ld pointer %ld",i,pointer[i]);
	}

	printf("\ntest2 pointer[%ld] %ld ",i-1,pointer[i-1]);

	*pointer2 = pointer;
}


Thank you very much Ancient Dragon for your reply...

for(i=1;i<= int_tmp;i++)

I am skipping first element purposly..cause it makes my engineering calculations...and I also using CF5[0] = 0; somewhere in programe to interpolate between 0 and 1 values.

Thank you very much again..

umeshjaviya
Newbie Poster
3 posts since May 2008
Reputation Points: 10
Solved Threads: 0
 

A couple of other notes:

- void main is evil . Don't use it. - You shouldn't have your function prototype inside main(). Move line 13 to somewhere before main()


I nerver thought void main had so much drawbacks thanks a lot for you advice.

Prabakar
Posting Whiz
342 posts since May 2008
Reputation Points: 94
Solved Threads: 33
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You