Прошу прощения, если здесь совершаются глупые ошибки, я новичок в 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).Отступ в этом файле лучше.Спасибо вам, ребята, ОГРОМНОЕ за помощь ваших парней заранее!