I have this "array" of pointers to structures initially allocated by a malloc, and I need to add additional memory by an increment when the initial capacity becomes full. When I try to allocate more memory, the first element seems to vanish and causes my program to crash. Can anyone help?
#include "a2.h" #include <stdio.h> #include <stdlib.h> #include <string.h> int idCompare ( const void * a, const void * b ){ message *m1 = *(message **)a; message *m2 = *(message **)b; return m1->messageId - m2->messageId; } int textCompare( const void *a, const void *b ) { message *m1 = *(message **)a; message *m2 = *(message **)b; return strcmp(m1->messageText, m2->messageText); } int main(void) { int id, i; int count = 0; char cmd[MAX_CMD_LEN]; char msg_text[MAX_TEXT_LEN]; message **mList = malloc(INITIAL_CAPACITY * sizeof(message)); int capacity = INITIAL_CAPACITY * sizeof(message); int size = 0; while (scanf("%s", cmd)){ if (!strcmp(cmd, "add")){ printf("(pre) Capacity =%d, Count =%d, Size =%d\n", capacity, count, size); int found = 0; scanf("%d\n", &id); fgets(msg_text, sizeof(msg_text), stdin); if(size >= capacity){ capacity = size; *(mList + count) = malloc(CAPACITY_INCREMENT * sizeof(message)); message *p = *(mList + count); if(p == NULL){ //If malloc fails, free mList and exit. printf("out of memory\n"); free(*mList); exit(1); } } for(i = 0; i < count; i++){ //If existing id is found, send flag & do not add. message *p = *(mList + i); if(p->messageId == id){ found = 1; } } if(!found){ message *p = *(mList + count); p->messageId = id; p->messageText = malloc(strlen(msg_text)+1); strcpy(p->messageText, msg_text); count++; size += 10 * sizeof(message); printf("(post) Capacity =%d, Count =%d, Size =%d\n", capacity, count, size); } } else if (!strcmp(cmd, "delete")){ //Cycle through mList, if id is found, shift elements left. scanf("%d", &id); for(i = 0; i < count; i++){ message *p = *(mList + i); if(p->messageId == id){ for(;i < count; i++){*(mList + i) = *(mList + i + 1);} count--; size -= 10 * sizeof(message); } } } else if (!strcmp(cmd, "find")){ //Cycle through mList, if id is matched, print to stdout. scanf("%d", &id); for(i = 0; i < count; i++){ message *p = *(mList + i); if(p->messageId == id){ printf("%s", p->messageText); } } } else if (!strcmp(cmd, "output")){ //Cycle through mList, print all to stdout. for(i = 0; i < count; i++){ message *p = *(mList + i); printf("%s", p->messageText); } } else if (!strcmp(cmd, "sortById")){ qsort (mList, count, sizeof(message*), idCompare); } else if (!strcmp(cmd, "sortByText")){ qsort (mList, count, sizeof(message*), textCompare); } } return 0; }