【问题标题】:Recursive binary tree gives memory access error递归二叉树给出内存访问错误
【发布时间】:2017-11-27 09:01:16
【问题描述】:

我们需要创建一个包含文本文件内容的二叉树。指针 selection_a 和 selection_b 指向目录中的另一个文本文件。

文本文件的结构如下: 1.行:标题 2.线路:选项A 3.线路:选项B 4. - 名词。行:文本。

第一个文件在启动程序时作为参数给出。所有文件都应保存在程序的开头。 然后显示第一个文件的文本,用户可以输入 A 或 B 继续。根据选择,显示文件选项A/B的文本,他可以再次决定。

树的最后一个文件不包含选项:2. 和 3. 行是“-\n”。

问题是,这段代码只读取了第一棵树的所有选项 A 文件。它没有读入任何 B-Options。 最后程序显示内存访问错误。

我知道代码可能有点乱,但我们是编程的初学者。 希望任何人都可以提供帮助。 代码如下:

struct story_file
{
  char *title;
  char *text;
  struct story_file *selection_a;
  struct story_file *selection_b;
};

【问题讨论】:

  • strcat(filename, txt); 是错误的,因为 filename` 指向的 argv[1] 可能不够大,无法附加“.txt”。
  • char ch = getc(input); 必须是 int ch = getc(input); 才能与 EOF 进行比较。
  • current->text = strcat(current->text,lines); 错误,因为您没有为此分配空间。
  • 你知道如何解决这个问题吗,我们真的不知道如何继续:/

标签: c memory


【解决方案1】:

readingRows() 中,您已将字符串文字分配给current->text

  current->text = "";

现在current->text 保存只读字符串,您正在 strcat() 中修改它

current->text = strcat(current->text,lines);

这将导致未定义的行为

【讨论】:

    【解决方案2】:

    你的主要问题在current->text

    首先,将其设置为current->text = "";,使其指向空字符串(和只读文字)。您应该将其设置为零:

     current->text = 0;
    

    然后你想给它附加文本但忘记为它分配内存:

     current->text = strcat(current->text,lines);
    

    你应该这样做:

    int currlen, linelen;
    linelen= strlen(lines);
    if (current->text) currlen= strlen(current->text); else currlen= 0;
    char *newtext= malloc(currlen+linelen+1);
    if (current->text) strcpy(newtext, current->text); else *newtext= 0;
    strcat(newtext, lines);
    if (current->text) free(current->text);
    current->text= newtext;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2021-05-19
      • 2016-04-19
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多