【问题标题】:malloc problems cause segmentation faultmalloc 问题导致分段错误
【发布时间】:2012-01-21 02:04:06
【问题描述】:

我们目前正在进行一个项目,我们需要处理一些文本,为此我们需要将文本分成更小的部分。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct paragraph{
   char **words;
}paragraph;

typedef struct text{
   char name[100];
   paragraph  *list;
}text;

void readFileContent(FILE *file, paragraph *pa, int size){

   char localString[100];

   pa->words = (char **)malloc(size * sizeof(char *));
   int i = 0, z;

   while(fscanf(file, "%s", localString) == 1 && i < size){
      z = strlen(localString);
      pa->words[i] = (char *)malloc(z + 1);

      strcpy(pa->words[i], localString);
      i++;
   }

}

void main(){
      int i = 0, n, z;
   FILE *file;
   text *localText;
   localText = (text *)malloc(sizeof(text));

   openFile(&file, "test.txt");
   i = countWords(file);

   i = i / 50 + 1; // calculate the number of section need for the text

   localText->list = calloc(sizeof(paragraph *), i);

   for(n = 0; n < i ; n++){
      printf("Paragraph - %d\n", n);
      readFileContent(file, &localText->list[i], 50);

   }

   for(n = 0; n < i ; n++){
      printf("Paragraph - %d", n);
      for(z = 0; z < 50; z++){
      printf("no. %d\n", z);
      printf("%s\n", localText->list[n].words[z]);
      }
   }

}

当我尝试运行程序时,底部的打印循环出现分段错误。我认为这是由于分配内存的问题引起的,但我不知道为什么。

更新 1 我已将代码更改为使用 3 维数组来存储文本段,但是当我尝试使用 malloc 分配内存时仍然出现分段错误。

localText->list[i][n] = malloc(100 * sizeof(char));

她是更改后的代码。

typedef struct {
   char name[100];
   char  ***list;
}text;

int main(){
   int i = 0, n, z,wordCount, sections;
   FILE *file;
   text *localText;

   openFile(&file, "test.txt");
   wordCount = countWords(file);


   sections = (wordCount / 50) + 1;

   localText = malloc(sizeof(text));
   localText->list = malloc(sections * sizeof(char **));

   for(i = 0; i < sections; i++)
      localText->list[i] = malloc(50 * sizeof(char *));
      for(n = 0; n < 50; n++)
         localText->list[i][n] = malloc(100 * sizeof(char));

   readFileContent(file, localText->list, 50);

   freeText(localText);

   return 1;

}

【问题讨论】:

  • 你应该在调试器中运行你的程序。当它崩溃时,您将能够检查变量的值。
  • 这是我第一次看到for (n = 0; n &lt; i; n++)而不是for (i = 0; i &lt; n; i++)...
  • @BlagovestBuyukliev:这可能是这里错误的根本原因。使用i 绑定数组是个坏主意。

标签: c malloc


【解决方案1】:

您的代码中有很多错误。以下是最严重的:

1) 指向指针的指针不是多维数组。如果您使用指针指向指针来访问多维、动态分配的数组,则需要以对指针指针有意义的方式分配该数组。

看起来您正在尝试动态分配一个指针数组,然后为该数组中的每个指针分配一个数据数组。但是,您的代码并没有这样做,您的代码有太多的间接级别没有任何意义。例如paragraph *list;,为什么需要一个指向包含指向指针的结构的指针?

您需要简化数据结构。我建议这样做:

typedef struct {
   char   name[100];
   char** list;
} text;

2) 不要将 typedef 命名为与 struct 标记相同的名称,这迟早会给你带来命名空间冲突的麻烦。在 typedef:ing 结构时,您甚至不需要结构标记,而是按照我上面的示例进行操作。

3) 永远不要在 C 语言中对 malloc/calloc 的结果进行类型转换。这隐藏了编译器警告和错误。在SO 上可以找到无数关于原因的详细帖子。

4) 由于这是一个在操作系统上运行的托管程序(我可以通过使用文件处理来判断),因此 main 除了 int 之外不能返回任何内容。将 main 的定义更改为 int main()它不会在标准 C 编译器上编译

5)for(n = 0; n &lt; i ; n++) ... list[i]。从您自己的代码可以看出,将变量名称i 用于除循环迭代器之外的任何东西都不是一个好主意。 (i 实际上代表迭代器)。这就是为什么你有一个错误。

6) 完成后必须通过fclose()关闭打开的文件。

7) 使用完动态分配的内存后,您必须通过free() 解除分配。

【讨论】:

  • 读完你的回放,让我意识到我在编码时不应该走捷径,因为这显然让我自己更难发现错误,谢谢。一方面不是实际问题。如果我有一个包含字符串列表的列表,那是 3d 数组还是 2d 数组?
  • @user1018046 这是明智的。根据经验,永远不要在不知道为什么要使用特定实践或方法的地方编写代码行,因为 C 语言本身存在很多缺陷。如果分配得当,字符串列表确实是一个 3D 数组。当涉及到多维数组时,C 相当复杂,comp.lang.c.faq优秀,是 C 语言有史以来最好的出版物之一。我强烈建议阅读问题 6.16。
【解决方案2】:
 readFileContent(file, &localText->list[i], 50);

您在此处初始化最后一个元素,而不是初始化所有其他列表元素。请改用list[n]

【讨论】:

    【解决方案3】:

    看来你这里打错了

    for(n = 0; n < i ; n++){
          printf("Paragraph - %d\n", n);
          readFileContent(file, &localText->list[i], 50);
    
       }
    

    不应该吗

    for(n = 0; n < i ; n++){
          printf("Paragraph - %d\n", n);
          readFileContent(file, &localText->list[n], 50);
    
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      相关资源
      最近更新 更多