【问题标题】:Dynamic Memory Allocation - Keep seg faulting动态内存分配 - 保持段错误
【发布时间】:2021-08-23 23:18:45
【问题描述】:

我必须使用这两个函数动态分配内存,但我不断收到段错误。该代码从文件中获取字符串。我需要使用结构、指针和 malloc 为特定数量的怪物动态分配内存。

typedef struct monster {
  char *name; 
  char *element; 
  int population;
  } monster;

monster* createMonster(char *name, char *element, int population){


//Copying the data into the monster
  monster *temp =(monster*) malloc(sizeof(monster));
  strcpy(temp->name, name);
  strcpy(temp->element, element);
  strcpy(temp->population, population);
  return temp; 
  free(temp);
}

 
monster** readMonsters(FILE* infile, int *monsterCount){

//getting monster count and creating temp pointers
monster **temp = NULL;
char m_word [8];
fscanf(infile, "%d", monsterCount); 
fscanf(infile, "%s", m_word); //reading the word monster to skip it
char*  temp_name;
char* temp_element;
int temp_pop; 

//allocating memory and creating an array of monster pointers * mcount
temp = (monster**)malloc(*monsterCount * sizeof(monster*));
for(int i = 0; i < monsterCount; i++){

  fscanf(infile, "%s",temp_name); 
  fscanf(infile, "%s",temp_element); 
  fscanf(infile, "%d",temp_pop); 
  monster *monster_temp = createMonster(temp_name, temp_element, temp_pop);
  temp[i]->name = monster_temp->name; 
  temp[i]->element = monster_temp->element; 
  temp[i]->population = monster_temp->population; 
}

  
 return temp; 
}

【问题讨论】:

  • 请将strcpy(temp-&gt;population, population); 改为temp-&gt;population = population;,因为整数不是字符串。
  • scanf 语句会出错,要么是因为没有为 %s 条目分配内存,要么是因为 %d 数据条目需要一个指针,例如 fscanf(infile, "%d", &amp;temp_pop); 注意添加&amp; 请启用编译器警告。
  • 编译器应该告诉你的错误更多,例如i &lt; monsterCount;应该是i &lt; *monsterCount;
  • 除以上所有内容外,以temp[i]-&gt;member = .... 开头的三个赋值应替换为单个temp[i] = monster_temp;。仅供参考,createMonster 中的 free(temp); 是无法访问的、不必要的,并且最终还是不正确的。它应该被删除。您从哪个参考指南学习 C,因为我可以建议您找到替代方法。
  • 请发minimal reproducible example,以便我们重现问题并帮助您调试。

标签: c dynamic-memory-allocation


【解决方案1】:

你还没有发布struct monster的定义。

如果 struct monster 包含很多 char* 并且您正在为它分配一个 char*,则该 char* 需要分配到某个地方。看起来 temp_name 和 temp_element 没有分配,这会导致 scanf 崩溃。

【讨论】:

  • typedef struct monster { char *name;字符 * 元素;国际人口; } 怪物;
【解决方案2】:

您的代码段错误,因为您在未初始化和未分配的指针处写入

您直接使用结构体的 strcpy nameelement 字段编写,但这两个字段指向未知位置

另外,你试试 strcpy 一个整数,直接赋值:temp->population = population ;

最后你不能return tempfree temp,如果你返回它会被重用,你不能释放它,希望你退出时永远不会到达free前一行的函数:)

为了将你的字符串存储到结构中,你有一些可能性

  • 在结构中将它们声明为 char 数组:char name[64]
  • 在结构中使用缓冲区并在其中设置名称和元素字段点
  • 在复制之前用 strlen 的原始字符串对它们进行 malloc
  • 直接将 createMonster 函数的 name 和 element vars 指向指针,它会使用原始内存,但这里不适合,因为它们来自临时内存

使用静态公共缓冲区为您的字符串创建怪物函数的示例(未经测试):

#define MONSTER_MAX_BF 64

typedef struct monster {
  char *name; 
  char *element; 
  int population;
  char bf[MONSTER_MAX_BF];
} monster;

monster* createMonster(char *name, char *element, int population){
  monster *temp =(monster*) malloc(sizeof(monster));
  char * lastBf = temp->bf + (MONSTER_MAX_BF - 1); // buffer last char
  char *bfp = bf, *p ;

  // copy name
  temp->name = bfp ;
  p = name ;
  while( *p && *bfp != lastBf ) *bfp++ = *p++ ;
  *bfp++ = 0;

  // copy element
  temp->element = bfp ;
  p = element ;
  while( *p && *bfp != lastBf ) *bfp++ = *p++ ;
  *bfp = 0;
  
  temp->population = population ;

  return temp; 
}

【讨论】:

    猜你喜欢
    • 2020-01-14
    • 1970-01-01
    • 2021-11-28
    • 2020-07-17
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多