2012-07-27 114 views
1

我在C中创建了一棵树,当我使用Visual C++(除了免费函数)时,所有东西都可以在我的计算机上运行。关于释放内存/跨平台兼容性的问题

当我在任何其他平台(DOS和UNIX上的gcc)上编译时,我在运行时也遇到了很多问题。我不知道那里有什么错。

在我的Visual C++调试它打破了以(1)

void freePhoneBook(PhoneBookP P) 
{ 
    traverseFree(P->Root); 
} 
static void traverseFree(NodeP N) 
{ 
    if(N) 
    { 
     traverseFree(N->Left); 
     traverseFree(N->Right); 
     free(N);//(1)<------fails here 
    } 
} 

错误说:

在00A01768堆块在00A01798过去的修改要求28级 的Windows的规模已经引发了电话簿中的断点。可执行程序。

这可能是由于堆的损坏,这表明PhoneBook.exe或其中已加载的任何DLL的错误。

这可能也是由于用户按下F12而PhoneBook.exe有焦点。

输出窗口可能有更多诊断信息。 HEAP [PhoneBook.exe]:指定给RtlValidateHeap的无效地址(00A00000,00A01770) Windows已触发PhoneBook.exe中的断点。

这可能是由于堆的损坏,这表明PhoneBook.exe或其中已加载的任何DLL的错误。

这可能也是由于用户按下F12而PhoneBook.exe有焦点。

输出窗口可能有更多诊断信息。

这里是我的所有代码:

/* 
* PhoneBook.h 
* Cop 3530 
* jlewis 
*/ 

#ifndef _phonebook_h 
#define _phonebook_h 

/* 
* PhoneBookP is a pointer to the phonebook struct 
* Define the phonebook struct and the node struct 
* in your (.c) file 
*/ 
typedef struct PhoneBookT *PhoneBookP; 

/* 
* PhoneBook Interface 
*/ 

/* 
* Returns a pointer to a new empty PhoneBook 
* If memory cannot be allocated, returns a NULL pointer 
*/ 
PhoneBookP newPhoneBook(); 

/* 
* Locates and displays the desired entry from the phone book 
* If entry is not found, display an appropriate message 
* Parameters: book, firstname, lastname 
*/ 
void lookupPhoneBook(PhoneBookP, char *); 

/* 
* Creates node with the provided data 
* Inserts the node into the correct position in the tree 
* NOTE: Copy the data into the node 
*/ 
void insertPhoneBook(PhoneBookP, char *, char *); 

/* 
* Removes the node containing the matching names 
* Parameters: phonebook, firstname 
* Returns true if successful, else false 
* 
* NOTE: THIS FUNCTION IS FOR BONUS POINTS 
* YOU CAN SIMPLY INSERT A DUMMY FUNCTION THAT 
* ALWAYS RETURNS ZERO IF YOU CHOOSE 
*/ 
int removePhoneBook(PhoneBookP, char *); 

/* 
* Dislpays all the entries in the Phone book in order 
* Display one person per line, firstname followed by phone number 
*/ 
void displayPhoneBook(PhoneBookP); 

/* 
* Frees the memory used by each node in the book 
* Frees the memory used by this addressbook 
*/ 
void freePhoneBook(PhoneBookP); 

#endif 

继承人的.c文件

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "PhoneBook.h" 
typedef struct NodeT 
{ 
    struct NodeT *Left; 
    struct NodeT *Right; 
    char *Name; 
    char *Number; 
}* NodeP; 

struct PhoneBookT 
{ 
    NodeP Root; 
}; 
static void Insert(PhoneBookP, NodeP, char* Name,char* Number); 
static void traversePrint(NodeP N); 
static NodeP newNode(PhoneBookP P, NodeP, char *Name,char *Number); 
static int find(NodeP N,char *Name); 
static void traverseFree(NodeP N); 
PhoneBookP newPhoneBook() 
{ 
    PhoneBookP P =(PhoneBookP) malloc(sizeof(PhoneBookP)); 
    P->Root = NULL; 
    return P; 
} 
void lookupPhoneBook(PhoneBookP P, char * Name) 
{ 
    if(find(P->Root, Name)); 
    else printf("Error\n"); 
} 
static int find(NodeP N,char *Name) 
{ 
    if(N) 
    { 
     find(N->Left,Name); 
     if(0 == strcmp(Name,N->Name)) 
     { 
      printf("Name: %s\nNumber: %s\n", N->Name, N->Number); 
      return 1; 
     } 
     find(N->Right,Name); 
    } 
    else 
     return 0; 
} 
void insertPhoneBook(PhoneBookP P, char *Name, char *Number) 
{ 
    if(P->Root) 
     Insert(P, P->Root, Name,Number); 
    else 
     P->Root = newNode(P,P->Root, Name,Number); 
} 
static void Insert(PhoneBookP P,NodeP N, char* Name,char* Number) 
{ 
    if(N) 
    { 
     if(0 > strcmp(Name,N->Name)) 
     { 
      if(N->Left) 
      { 
       Insert(P,N->Left, Name, Number); 
      } 
      else 
      { 
       N->Left = newNode(P,N->Left, Name, Number); 
      } 
     } 
     else 
     { 
      if(N->Right) 
      { 
       Insert(P,N->Right, Name, Number); 
      } 
      else 
      { 
       N->Right = newNode(P,N->Right, Name, Number); 
      } 
     } 
    } 
    else 
     N = newNode(P, N, Name, Number); 
} 
static NodeP newNode(PhoneBookP P,NodeP N,char *Name,char *Number) 
{ 
    NodeP New = (NodeP) malloc(sizeof(NodeP)); 
    N = New; 
    New->Left = NULL; 
    New->Right = NULL; 
    New->Name = Name; 
    New->Number = Number; 
    return New; 
} 
int removePhoneBook(PhoneBookP P, char * Name) 
{ 
    return 0; 
} 
void displayPhoneBook(PhoneBookP P) 
{ 
    traversePrint(P->Root); 
} 
static void traversePrint(NodeP N) 
{ 
    if(N) 
    { 
     traversePrint(N->Left); 
     printf("Name: %s\n", N->Name); 
     printf("Number: %s\n", N->Number); 
     traversePrint(N->Right); 
    } 
} 
void freePhoneBook(PhoneBookP P) 
{ 
    traverseFree(P->Root); 
} 
static void traverseFree(NodeP N) 
{ 
    if(N) 
    { 
     traverseFree(N->Left); 
     traverseFree(N->Right); 
     free(N); 
    } 
} 

这里的测试 我没有删除功能,所以请不要使用。

/* 
* PhoneBookTest.h 
* Cop 3411 Spr11 
* jlewis 
*/ 

#include "PhoneBook.h" 
#include <stdio.h> 

int main() 
{ 
    PhoneBookP myBook = newPhoneBook(); 
    printf("Book contains (Joe, Sue, Tom, Vince, Zachary)\n"); 
    insertPhoneBook(myBook, "Sue", "800-444-4444"); 
    insertPhoneBook(myBook, "Joe", "555-5555"); 
    insertPhoneBook(myBook, "Tom", "111-1111"); 
    insertPhoneBook(myBook, "Zachary", "1-888-888-8888"); 
    insertPhoneBook(myBook, "Vince", "333-3333"); 
    displayPhoneBook(myBook); 
    printf("\nLooking for Sue ... "); 
    lookupPhoneBook(myBook, "Sue"); 
    printf("Looking for Tom ... "); 
    lookupPhoneBook(myBook, "Tom"); 
    printf("Looking for Zac ... "); 
    lookupPhoneBook(myBook, "Zachary"); 
/* 
    fprintf(stderr, "\nRemoving Joe\n"); 
    removePhoneBook(myBook, "Joe"); 
    displayPhoneBook(myBook); 
*/ 
    printf("\nAdding 5 more ... Al, Jason, Thomas, Billy, Tommy\n"); 
    insertPhoneBook(myBook, "Al", "888-8888"); 
    insertPhoneBook(myBook, "Jason", "888-8888"); 
    insertPhoneBook(myBook, "Thomas", "888-8888"); 
    insertPhoneBook(myBook, "Billy", "888-8888"); 
    insertPhoneBook(myBook, "Tommy", "888-8888"); 
    displayPhoneBook(myBook); 
    /* 
    fprintf(stderr, "\nRemoving Thomas\n"); 
    //removePhoneBook(myBook, "Thomas"); 
    displayPhoneBook(myBook); 
    fprintf(stderr, "\nRemoving Zachary\n"); 
    //removePhoneBook(myBook, "Zachary"); 
    displayPhoneBook(myBook);*/ 
    freePhoneBook(myBook); 
    return 0; 
} 

任何帮助深表感谢

而且这是由于在下午4点中心的时间。

谢谢!

+3

这是很多代码。您应该通过使用调试器将其缩小到错误,并向我们展示一段更简洁的代码,该代码仍会显示错误。 – pmr 2012-07-27 18:55:20

+1

在调试器或valgrind下运行您的代码以帮助识别问题并修复错误。 – 2012-07-27 19:00:07

+0

也请注意您的[上一个问题](http://stackoverflow.com/questions/11299723/assigning-a-pointer-in-a-struct-to-a-variable)中给出的建议,并且不要投射malloc的结果。 – 2012-07-28 06:47:46

回答

1

一个主要的错误是,当你通过sizeof(struct PhoneBookT)sizeof(*P)时,你传递sizeof(PhoneBookP)到malloc。

+0

'typedef struct PhoneBookT * PhoneBookP;'我相信这应该解决这个问题。 – PilHliP 2012-07-27 19:04:25

+0

Abd类似于'NodeP'的'malloc()'调用 – YePhIcK 2012-07-27 19:13:28

+0

当我给指针的sizeof指针时,出现语法错误。 – PilHliP 2012-07-27 19:17:26