尝试为结构中的字符串分配内存时出现分段错误

时间:2012-04-24 01:12:36

标签: c pointers struct segmentation-fault malloc

解决我必须将文件中的数据读入结构的问题。

文件的组织方式是有一个名称,几行ASCII艺术作品以#和等级结尾。这是一个例子

Sample Name
( S )
( S )
# 5

我的结构设置如下:

typedef struct
 {
   char* name;
   char* art;
   int rating;
 }CASE;

我的问题是,当我尝试在下面的代码中为名称字符串动态分配内存时,我不断获得segmentation fault

/*FPin is file pointer to the txt file and all is the array of structs*/
void readFile(FILE* FPin, CASE** all)
{ 
  CASE* walker = *all;
  int count = 0;
  char buffer[160];
  char* bufferPtr = buffer;
  char nameBuffer[100];

  /*Reads in the name*/

  while(fscanf(FPin, "%[^\n]", nameBuffer))
  {
    printf("string is %s\n", nameBuffer);
    walker->name = (char*)malloc(sizeof(char)*(strlen(nameBuffer+1)));  /*ERROR*/  
    strcpy(walker->name, nameBuffer);
  } 

  return;
  }

我记下了上述代码中我认为错误的位置,因为一旦我添加了该行,我就开始了解它。

我基本上是从文本中读取名称到nameBuffer(数组),然后使用strcpy将此名称复制到结构中。关于如何解决这个问题的任何建议?

感谢您的光临。

我将在下面提供我的其他资源:

int main (void)
{
  CASE* all;
  FILE* FPin;

  if((FPin = fopen("art.txt", "r")) == NULL)
  {
    printf("Error opening file.");
    exit(100);  
  }

  allocateStructMem(&all);
  readFile(FPin, &all);

  fclose(FPin);
  return 0;
}

void allocateStructMem (CASE** all)
{
  if((*all = (CASE*)malloc(sizeof(CASE)*1000)) == NULL)
    {
      printf("Fatal memory error!\n");
      exit(1);
   }

  return;
}

2 个答案:

答案 0 :(得分:3)

<击>的strlen(nameBuffer + 1)

strlen(nameBuffer)+1

当你使用malloc all

时,你还必须做这样的事情
int allocateStructMem(CASE **all)
{
    /*  +----- Note. And no need to cast as malloc returns (void *)
        |                                           */
    if((*all = malloc(sizeof(CASE*) * 1000)) == NULL)

为防止溢出,您必须限制fscanf的长度,即:

while (fscanf(FPin, "%99[^\n]", nameBuffer) == 1) {

1确保您实际读取了nameBuffer中的内容。

strcpy也没有填充 - 但你可能知道。

答案 1 :(得分:2)

在括号外移动+1会有帮助吗?

walker->name = (char*)malloc(sizeof(char)*(strlen(nameBuffer)+1));  /*ERROR*/