realloc and Segmentation Fault

Jonathan Shan jonshan@winlab.rutgers.edu
Wed Jul 19 20:36:00 GMT 2006


I can't figure out why valid = insert_to_bucket(valid) is wrong.
I am trying to pass the memory address of 'valid' pointer around in some 
functions. Whenever the memory allocated to valid changes, then the memory 
address of 'valid' pointer changes.

Also, I could not find a way to insert "return insert_to_bucket(valid)" in 
the code.

On Wed, 19 Jul 2006, Andrew Haley wrote:

> Jonathan Shan writes:
> > Thanks your explanation of realloc helped.
> >
> > I made a simple test program which worked, then I made a program which
> > passed 'valid' pointer around some functions and it did not compile with
> > error: conflicting types.
> >
> > This is the simplest code which exhibits the error:
> >
> > struct bucket
> > {
> >  	char *hostname;
> >  	char *description;
> > };
> > int bucketsize = 1;
> > void func1(struct bucket *valid)
> > {
> >  	func2(valid);
> > }
> > void func2(struct bucket *valid)
> > {
> >  	/*this code causes errors*/
> >  	valid = insert_to_bucket(valid);
>
> return insert_to_bucket(valid);
>
>
> > }
> > struct bucket *insert_to_bucket(struct bucket *valid)
> > {
> >  	valid[bucketsize - 1].hostname = malloc (sizeof(char) * 20);
> >  	strncpy(valid[bucketsize - 1].hostname, "test hostname", 20);
> >  	valid[bucketsize - 1].hostname[19] = '\0';
> >  	printf("hostname is %s \n", valid[bucketsize - 1].hostname);
> >
> >  	valid[bucketsize - 1].description = malloc (sizeof(char) * 50);
> >  	strncpy(valid[bucketsize - 1].description, "test buf", 50);
> >  	valid[bucketsize - 1].description[49] = '\0';
> >  	printf("description is %s \n", valid[bucketsize - 1].description);
> >
> >  	valid = (struct bucket *) realloc (valid, 70 * ((bucketsize) +
> > 1));
> >  	bucketsize++;
> >  	return valid;
> > }
> > int main()
> > {
> >    struct bucket *valid;
> >    valid = (struct bucket *) malloc (70);
> >    if (valid == NULL)
> >    {
> >  	printf("error in allocating memory \n");
> >  	exit(1);
> >    }
> >    struct bucket *insert_to_bucket();
>
> What is this for ??
>
> >    /*the line directly below works*/
> >    //	valid = insert_to_bucket(valid);
> >
> >    /*the line directly below causes errors*/
> >    func1(valid);
> >
> >    return 0;
> > }
> >
> > On Wed, 19 Jul 2006, Vladimir Vassilev wrote:
> >
> > > Hello Jonathan,
> > >
> > > There is bug in your program. The 'valid' pointer in 'main' has the same
> > > value before and after the call to function1. The realloc call in function1
> > > deallocates this memory allocates new one and returns the new address.
> > > However in main you continue to use the now invalid address and use it in the
> > > next call.
> > >
> > > Probably you assume realloc just extends the already allocated memory and the
> > > ptr remains the same which is not the case.
> > >
> > > Regards,
> > > Vladimir
> > >
> > > Jonathan Shan wrote:
> > >> Hello all,
> > >>
> > >> The goal of my program is to create a dynamic array of a struct type. The
> > >> struct type has two strings inside it. From time to time I want to copy
> > >> strings into the strings in the dynamic array. Then increase the size of
> > >> the dynamic array. I have narrowed the problem down to the realloc
> > >> function but I still don't know why it says segmentation fault or hangs
> > >> (sometimes).
> > >>
> > >> Here is the simplified code which exhibits the problem:
> > >>
> > >> /*libraries here */
> > >>
> > >> #define SIZEOF_BUCKETSTRUCT 70
> > >> #define SIZEOF_HOSTNAME 20
> > >> #define SIZEOF_DESCRIPTION 50
> > >>
> > >> int bucketsize = 1;
> > >> struct bucket
> > >> {
> > >>     char *hostname;
> > >>     char *description;
> > >> };
> > >> void function1(struct bucket *valid)
> > >> {
> > >>     valid[bucketsize - 1].hostname = malloc (sizeof(char) * 20);
> > >>     strncpy(valid[bucketsize - 1].hostname, "test hostname", 20);
> > >>     valid[bucketsize - 1].hostname[19] = '\0';
> > >>     printf("hostname is %s \n", valid[bucketsize - 1].hostname);
> > >>
> > >>     valid[bucketsize - 1].description = malloc (sizeof(char) * 50);
> > >>     strncpy(valid[bucketsize - 1].description, "test buf", 50);
> > >>     valid[bucketsize - 1].description[49] = '\0';
> > >>     printf("description is %s \n", valid[bucketsize - 1].description);
> > >> /* problem is here */
> > >>     valid = (struct bucket *) realloc (valid, 70 * ((bucketsize) + 1));
> > >>     bucketsize++;
> > >> }
> > >> int main()
> > >> {
> > >>   struct bucket *valid;
> > >>   valid = (struct bucket *) malloc (SIZEOF_BUCKETSTRUCT);
> > >>   if (valid == NULL)
> > >>   {
> > >>     printf("error in allocating memory \n");
> > >>     exit(1);
> > >>   }
> > >>
> > >>   function1(valid);
> > >>   function1(valid);
> > >>
> > >>   return 0;
> > >> }
> > >>
> > >> Thank you,
> > >>
> > >> Jonathan Shan
> > >
> > >
> > > --
> > > =========================================================================================
> > > Vladimir Vassilev                      |
> > > Logicom Consult EOOD                   | E-mail:
> > > Mladost 1A, bl. 501, apt. 68           | vladimir@logicom-bg.com
> > > Sofia, Bulgaria                        | Web:
> > > Tel:+359 886979158                     | http://www.logicom-bg.com
> > >
> > >
> > >
>



More information about the Gcc-help mailing list