what flaw does realloc have? Please explain. On Oct 21, 2009, at 9:47 PM, Ravi Mishra wrote:
> thanks john .give me a gud approach my code is in C language. > I don't want to use realloc because realloc has some flaw. i just > want to > use malloc.. > actually intally i don't know how much byte will allocate memory for > sturcture and second time i have to preserve the first user memory and > append second user allocate memory and so on. > > one apporach i am thinking i.e first user memory i will store and > found how > many byte it is required and when second user allocate memory i just > coping > memory allocation of first user in and append second user memory in > temp > variable. > > may be i have to use realloc for this .. > > Any other approach is there... > > -Ravi > > On Thu, Oct 22, 2009 at 1:30 AM, johnmatthews2000 <jm5...@gmail.com> > wrote: > > > > > > > > > > > --- In c-prog@yahoogroups.com <c-prog%40yahoogroups.com>, Ravi > Mishra > > <ravics...@...> wrote: > > > > > > I have a question regarding struct when making Table eg. > > > > C or C++? > > > > Basically your types X/Y/Z should contain pointers to the list > data, so the > > data does not actually reside within the table structure itself. > Hence the > > lists can grow without overwriting other fields within the table. > > > > In C++ (which isn't my language) there are Standard Library list > types > > which you can use. In C you don't get any standard list types, but > there are > > plenty of implementations out there that you can use. > > > > Here's a very simple C program that constructs a list from any > number of > > values passed on the command line and prints them out. It makes > use of the > > realloc() function to grow the list dynamically. Note that the list > > structure only contains a pointer to the data, and not the data > itself. > > > > #include <assert.h> > > #include <stdio.h> > > #include <stdlib.h> > > > > /* List structure. */ > > typedef struct List_s > > { > > int *a; /* pointer to the data a[0..n-1] */ > > int n; /* size of list */ > > } List_t; > > > > /* Initialise the list. */ > > static void listInit(List_t *list) > > { > > list->a = NULL; > > list->n = 0; > > } > > > > /* Add the value to the end of the list. */ > > static void listAddEnd(List_t *list, int val) > > { > > /* First increase the size of the list by 1. If the value of list->a > > * changes, then realloc() copies the data from the old location to > > * the new location. */ > > list->a = realloc(list->a, (list->n + 1) * sizeof list->a[0]); > > > > /* Now store the value in the (empty) new location at end of the > list. */ > > list->a[list->n++] = val; > > } > > > > /* Return the item at index idx in the list. */ > > static int listGet(const List_t *list, int idx) > > { > > /* Ensure the index is within bounds. */ > > assert(idx < list->n); > > > > return list->a[idx]; > > } > > > > /* Return the size of the list. */ > > static int listSize(const List_t *list) > > { > > return list->n; > > } > > > > int main(int argc, char *argv[]) > > { > > List_t list; > > int i, size; > > > > listInit(&list); > > > > /* Add the values on the command line to the list. > > * Ignore argv[0] which is the program name. */ > > for (argc--, argv++; argc--; argv++) > > { > > listAddEnd(&list, atoi(*argv)); > > } > > > > /* Output the contents of the list. */ > > for (size = listSize(&list), i = 0; i < size; i++) > > { > > printf("%2d: %8d\n", i, listGet(&list, i)); > > } > > > > return 0; > > } > > > > $ gcc -Wall list.c > > $ a.out 1 5 7 10 127 > > 0: 1 > > 1: 5 > > 2: 7 > > 3: 10 > > 4: 127 > > > > > > > > [Non-text portions of this message have been removed] > > [Non-text portions of this message have been removed]