Re: realloc and Segmentation Fault

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux