0

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

4
Contributors
6
Replies
7
Views
8 Years
Discussion Span
Last Post by Prabakar
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 *);

0

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

0

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

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.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.