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@xxxxxxxxxxxxxx
> > Sofia, Bulgaria | Web:
> > Tel:+359 886979158 | http://www.logicom-bg.com
> >
> >
> >