The fact is that when I try to allocate memory for curList, my program crashes. This variable is passed to the function with the value NULL. When debugging, GDB outputs the following: "Program recieved signal SIGSEGV, Segmentation fault". However, in previous work I had the same function, and there was no such problem. Tell me, what can this be connected with?
PConst createNode(char **str_array, PConst NewNode, PLOM curList, PLOMHead curHead, int i) { PLOM helpList; int slen; char *endOfString; NewNode = (PConst)realloc(NewNode, (i+1)*sizeof(struct constellation)); slen = strlen(str_array[0]); NewNode[i].Name = (char*)malloc((slen+1)*sizeof(char)); memcpy(&NewNode[i].Name, &str_array[0], slen+1); slen = strlen(str_array[1]); NewNode[i].Abbreviation = (char*)malloc((slen+1)*sizeof(char)); memcpy(&NewNode[i].Abbreviation, &str_array[1], slen+1); slen = strlen(str_array[2]); curList->Month = (char*)malloc((slen+1)*sizeof(char)); memcpy(&curList->Month, &str_array[2], slen+1); addMonth(curHead, curList); helpList = curHead->first; do { if ((strcmp(helpList->Month, curList->Month)==0)) NewNode[i].Month = helpList; helpList = helpList->next; } while (helpList != curHead->first); slen = strlen(str_array[3]); endOfString = str_array[3]+slen; NewNode[i].area = strtol(str_array[3], &endOfString, 10); slen = strlen(str_array[4]); endOfString = str_array[4]+slen; NewNode[i].latitude[0] = strtol(str_array[4], &endOfString, 10); slen = strlen(str_array[5]); endOfString = str_array[5]+slen; NewNode[i].latitude[1] = strtol(str_array[5], &endOfString, 10); checkAndSwap(&NewNode[i].latitude[0], &NewNode[i].latitude[1]); slen = strlen(str_array[6]); endOfString = str_array[6]+slen; NewNode[i].max_declination = strtof(str_array[6], &endOfString); slen = strlen(str_array[7]); endOfString = str_array[7]+slen; NewNode[i].min_declination = strtof(str_array[7], &endOfString); slen = strlen(str_array[8]); endOfString = str_array[8]+slen; NewNode[i].bs_qntt = strtol(str_array[8], &endOfString, 10); curList->next = curHead->first; return NewNode; } typedefs and structures look like this:
struct constellation { char *Name; char *Abbreviation; struct listOfMonths *Month; int area; int latitude[2]; float max_declination; float min_declination; int bs_qntt; }; struct listOfMonths { char *Month; struct listOfMonths *next; }; struct lOMHead { struct listOfMonths *first; struct listOfMonths *last; }; typedef struct constellation *PConst; typedef struct listOfMonths *PLOM; typedef struct lOMHead *PLOMHead; In main, the function is called like this:
int main() { enum {max_name_len = 512, max_firm_name = 50}; PConst cnstlltns = NULL; PLOMHead head; PLOM currentLOM = NULL; int i = 0, m; char **help_str; char s1[max_name_len]; FILE *input = fopen("CSV.txt","r"); if (!input) { printf("ERROR! Nothing to read!\n"); return 0; } head = makeHead(); while (!feof(input)) { fgets(s1, max_name_len, input); help_str = simpleSplit(s1); cnstlltns = createNode(help_str, cnstlltns, currentLOM, head, i); cnstlltns = realloc(cnstlltns,(i+1)*sizeof(struct constellation)); for (m = 2; m < 6; m++) free(help_str[m]); free(help_str); i++; } fclose(input); printf("Success in reading data. Start the program.\n\n"); mainMenu(cnstlltns, i, head); free(cnstlltns); return 0; } I compile using the GNU GCC Compiler in CodeBlocks 16.1, the operating system is Win 7. I hope for your responsiveness.