Почему левый узел размещается в недоступном месте так рано в программе? - PullRequest
0 голосов
/ 05 марта 2019

Прошу прощения, если здесь совершаются глупые ошибки, я новичок в C и все еще пытаюсь понять, как работают указатели, и узнать, где что-то размещается в памяти.

В настоящее времяЯ пытаюсь создать программу, которая читает из входного файла и распечатывает каждую строку, отсортированную по их значениям ASCII.Программа запускается с разбора командной строки, а затем устанавливает флаги в зависимости от того, что пользователь ввел в командной строке.Поэтому моя проблема здесь в том, что цикл while запускается один раз, а затем во второй раз запускается, так как происходит сбой в функции addTreeNode () в той же строке, что и первый оператор «if» в цикле while в «else».

Это связано с утечкой памяти, поскольку добавляемый второй узел помещается в 0x200, который является недоступным адресом.Вот основные функции, addTreeNode () и strcmpC (), а также используемые мной структуры:

typedef struct NODE{

char* line;
int count;
struct NODE *left, *right;

       }NODE;

typedef struct BST{

NODE *root;


      } BST;

Main ...

void main(int argc, char **argv){

extern int optind;
extern char *optarg;

int cflag = 0, iflag = 0, oflag = 0;

char *usage = "bstsort [-c] [-o output_file_name] [input_file_name]";
int com;

FILE *fpointer_in;
FILE *fpointer_out;
char *filename_in;
char *filename_out;
int MAX_STRING_LENGTH = 100;

while((com  = getopt(argc, argv, "ci:o:")) != -1){


    switch(com){

        case 'c':
            cflag = 1;

            //p
            //What strings do we compare?

            break;





        case 'o':
            oflag = 1;
            filename_out = optarg;
            break;      

           }







                         }



    BST* binary_tree = malloc(sizeof(BST));
    filename_in = argv[argc - 1];

    fpointer_in = fopen(filename_in, "r");

    while(!feof(fpointer_in)){



        NODE* new_node = malloc(sizeof(NODE));
        new_node->line = calloc(MAX_STRING_LENGTH, sizeof(char));

        fscanf(fpointer_in, "%[^\n]", new_node->line);
        new_node->count = 1;

        addTreeNode(new_node, binary_tree, cflag);





                 }

    printTree(binary_tree->root);   


    fclose(fpointer_in);


/*      NODE* testN = malloc(sizeof(NODE));
    NODE* testN1 = malloc(sizeof(NODE));
    NODE* testN2 = malloc(sizeof(NODE));
    NODE* testN3 = malloc(sizeof(NODE));

    testN->line = calloc(MAX_STRING_LENGTH, sizeof(char));
    testN1->line = calloc(MAX_STRING_LENGTH, sizeof(char)); 
    testN2->line =  calloc(MAX_STRING_LENGTH, sizeof(char));     
    testN3->line = calloc(MAX_STRING_LENGTH, sizeof(char));

    strcpy(testN->line, "B");
    strcpy(testN1->line, "A");  
        strcpy(testN2->line, "C");  
    strcpy(testN3->line, "C");

    testN->count = 1; 
    testN1->count = 1;  
    testN2->count = 1;  
    testN3->count = 1;  

    addTreeNode(testN, binary_tree, 1);
    addTreeNode(testN1, binary_tree, 1);
    addTreeNode(testN2, binary_tree, 1);
    addTreeNode(testN3, binary_tree, 1);

     NODE* s = NULL;
     s = cpyNode(s, binary_tree->root);
     printTree(binary_tree->root);
      binary_tree->root = cpyNode(binary_tree->root, s);
     free(s);
     free(testN->line);
    free(testN1->line);
     free(testN2->line);
     free(testN3->line);
     free(testN);
     free(testN1);
     free(testN2);
     free(testN3);
*/
if(oflag == 1){


    fpointer_out = fopen(filename_out, "w");





    fclose(fpointer_out);
          }

          }

Вот addTreeNode () функция:

void addTreeNode(NODE* add, BST* tree, int cflag){



if(tree->root == NULL){
    tree->root = malloc(sizeof(NODE));//25 is a test var.
    tree->root->line = calloc(100, sizeof(char));//25 is a test variable.
    strcpy(tree->root->line, add->line);
    tree->root->count = add->count;

              }

else{//FIXME: Use size_t pointers so that you can later free the memory holding the hard-coded addresses.


    bool found = false;

    size_t pointer_backup, head_root_backup = (size_t) tree->root;

    while(tree->root != NULL && found == false){

        if(strcmpC(add->line,  tree->root->line, cflag) < 0){
            pointer_backup = (size_t)tree->root;                
            tree->root = tree->root->left;



                                    }
        else if(strcmpC(add->line,  tree->root->line, cflag) > 0){

            pointer_backup = (size_t)tree->root;
            tree->root = tree->root->right;
                                      }

        else if(strcmpC(add->line,  tree->root->line, cflag) == 0){

            tree->root->count++;
            found = true;

                                 }





                  }

    if(found == false){
         tree->root = malloc(sizeof(NODE));
         tree->root->line = calloc(100, sizeof(char));//25.
         tree->root =  cpyNode(tree->root, add); 


         NODE* connect_parent = (NODE*) pointer_backup;

        if(strcmpC(connect_parent->line, tree->root->line, cflag) > 0){

            connect_parent->left = tree->root;
                                      }

        if(strcmpC(connect_parent->line, tree->root->line, cflag) < 0){

            connect_parent->right  = tree->root;
                                        }       


              }

     printf("%s", tree->root->line);
     tree->root = (NODE*) head_root_backup; 
                   }


        }   

Вот функция strcmpC ():

int strcmpC(char* str1, char* str2, int cflag){

char str1c[100] = "";
char str2c[100] = "";
strcpy(str1c, str1);
strcpy(str2c, str2);    

int str_itr;
int to_lowercase;

if(cflag == 0){

    for(to_lowercase = 0; to_lowercase < strlen(str1c); to_lowercase++){


        if(str1c[to_lowercase] > 64 && str1c[to_lowercase] < 91){

        //Capital letters go from 65 to 90 in the ASCII table
        //Lowercase letter go from 97 to 122
            str1c[to_lowercase] += 32;
                                    }               


                                        }



    for(to_lowercase = 0; to_lowercase < strlen(str2c); to_lowercase++){


        if(str2c[to_lowercase] > 64 && str2c[to_lowercase] < 91){

        //Capital letters go from 65 to 90 in the ASCII table
        //Lowercase letter go from 97 to 122
            str2c[to_lowercase] += 32;
                                    }               


                                        }            
         }

str_itr = 0;
while(str1c[str_itr] != 0 && str2c[str_itr] != 0){

    if(str1c[str_itr] < str2c[str_itr]){

        return -1;
                       }



    if(str1c[str_itr] > str2c[str_itr]){

        return 1;
                       }
    str_itr++;

                            }

if(str1c[str_itr] == 0 && str2c[str_itr] != 0){

    return -1;

                           }
else if(str2c[str_itr] == 0 && str1c[str_itr] != 0){

    return 1;
                           }

return 0;



                       }

Я не понимаю, почему в программе произошла утечка памяти очень рано.В основном, есть закомментированный блок кода, в котором я создаю 4 узла и успешно добавляю их, а затем распечатываю их.Здесь нет проблем, узлы добавляются на свои места, копируются на другой резервный узел и печатаются.Но когда я пытаюсь прочитать строки из входного файла и создать узлы из этих строк, моя программа получает эту утечку памяти.

Пожалуйста, извините за отступ, у меня ДЕЙСТВИТЕЛЬНО нет времени редактировать этот код, как у меняотправиться на работу, но задание должно быть передано сегодня вечером.Мне пришлось открыть файл в VisualStudio, хотя я работал над ним в ocelot (среда UNIX).Отступ в этом файле лучше.Спасибо вам, ребята, ОГРОМНОЕ за помощь ваших парней заранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...