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

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 *);

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

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

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.

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

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.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.