【问题标题】:C++ : Strings, Structures and Access Violation Writing LocationsC++:字符串、结构和访问冲突写入位置
【发布时间】:2014-08-29 19:32:41
【问题描述】:

我正在尝试使用来自方法的字符串输入并将其设置为结构的变量,然后我将其放入链接列表中。我没有包括所有代码,但我确实发布了构造函数和所有这些好东西。现在代码正在中断

node->title = newTitle;
node->isbn = newISBN;

所以 newTitle 是来自我试图设置为变量节点的 Book 结构的标题变量的方法的字符串输入。现在,我假设这与指针问题并试图为它们设置数据有关,但我无法找到修复/替代方案。 另外,我尝试使用

strcpy(node->title, newTitle)

但这在将字符串转换为字符列表时存在问题,因为 strcpy 仅使用字符列表。还尝试了其他一些方法,但似乎都没有成功,我们将不胜感激。

struct Book
{
   string title;
   string isbn;
   struct Book * next;
};

//class LinkedList will contains a linked list of books
class LinkedList
{
 private:
     Book * head;

 public:
     LinkedList();
     ~LinkedList();
     bool addElement(string title, string isbn);
     bool removeElement(string isbn);
     void printList();
 };

 //Constructor
 //It sets head to be NULL to create an empty linked list
 LinkedList::LinkedList()
 {
     head = NULL;
 }

 //Description: Adds an element to the link in alphabetical order, unless book with 
    same title then discards
 // Returns true if added, false otherwise
 bool LinkedList::addElement(string newTitle, string newISBN)
 {

struct Book *temp;
struct Book *lastEntry = NULL;
temp = head;
if (temp==NULL) //If the list is empty, sets data to first entry
{
    struct Book *node;
    node = (Book*) malloc(sizeof(Book));
    node->title = newTitle;
    node->isbn = newISBN;
    head = node;
}
while (temp!=NULL)
{
    ... //Rest of Code

【问题讨论】:

  • 你在哪里学习?看起来这是“带字符串的 C”,而不是 C++。例如,您不需要使用 struct 关键字在结构的指针声明前加上 Book* temp; (最好也带有初始化)。也几乎没有理由使用malloc 而不是new
  • 我没有那么优秀的 C 和 C++ 老师(他确实告诉我们他放在板上的代码无法在编译器上正确运行)而我没有了解 c++ 的许多“正确”或更新的声明

标签: string visual-c++ linked-list structure


【解决方案1】:

请注意,您的 Book 结构已经是一个链表实现,因此您根本不需要 LinkedList 类,或者您不需要结构的“下一个”元素。

但是,您粘贴的最后一个(长)代码 sn-p 没有理由在您指示的行中出现错误。 node->title = newTitle 应该将 newTitle 中的字符串复制到结构的标题字段。字符串对象是固定大小的,因此不可能覆盖任何缓冲区并导致段错误。

但是,您在代码中进一步执行的操作可能会导致内存损坏,直到稍后才会导致错误。要查找的是任何数组,包括 char[],您可能会过度填充。另一个想法是你提到你保存方法参数。如果你复制,没关系,但如果你做类似的事情

char* f() {
    char str[20];
    strcpy(str, "hello");
    return str;
}

...那你就有问题了。 (因为 str 是在堆栈上分配的,并且您只返回指向在函数返回后将无效的位置的指针。)方法参数是局部变量。

【讨论】:

    【解决方案2】:

    您寻求的答案可以在here找到。

    简而言之:malloc 返回的内存不包含正确构造的对象,因此您不能这样使用它。尝试改用new / delete

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多