C,为结构数组中的字符串分配内存

时间:2016-05-17 09:38:42

标签: c arrays struct

我在这个网站上看到了这个问题,但仍然没有找到解决方案。 我有一个struct数组,我想从文件中读取一些记录并将它们存储在结构中。问题是内存的分配。 这是我使用的结构:

struct Rec{
    int mat;
    char *nome;
    char *cognome;
};
typedef struct Rec* Record; 

这是readFromFile函数:

void readFromFile(char* fileName, Record** data, int* pn) 
{
   char line[LINE_LENGTH];
   int n, i;
   char* token;
   printf("\n\nReading file %s\n", fileName);
   FILE* fin = fopen(fileName, "r"); 
   if (fin == NULL) 
   {  printf("Error readinf file\n");getch();
      goto end;
   }
   n = 0;         // first read to know the number of lines
   while (fgets(line, LINE_LENGTH, fin) != NULL) n++;
   n = (n < MAX_LENGTH ? n : MAX_LENGTH);
   printf("N: %d\n", n);
   *pn = n;

   //Then I allocate the memory for the n lines I previously read
   *data = (Record*)malloc(n * sizeof(Record));
   if(*data == NULL){
    printf("Problem allocating memory\n");
    exit(0);
   }
   i = 0;
   for(i = 0; i < n; i++){
        (*data)[i].nome = malloc(sizeof(char) * MAX_LENGTH + 1);
        if((*data)[i]->nome == NULL){
            printf("Problem allocating memory\n");
            exit(1);
        }
        //Here comes the problem, the allocation of the second string fails and the program exit
        (*data)[i]->cognome = malloc((sizeof(char) * MAX_LENGTH + 1));
        if((*data)[i]->cognome == NULL){
            printf("Problem allocating memory\n");
            exit(2);
        }
   }
   rewind(fin);                         
   n = 0;
   while (fgets(line, LINE_LENGTH, fin) != NULL && n < MAX_LENGTH)
   {
        token = strtok(line, ";");
        strcpy((*data)[n]->nome, token);
        token = strtok(line, ";");
        strcpy((*data)[n]->cognome, token);
        token = strtok(line, ";");
        (*data)[n]->mat = atoi(token);
        n++;

   }
   fclose(fin);                         
   end:return;
}

我试图在很多方面修改结构和代码,但还没有找到解决方案,我认为这可能是一个指针问题,但我无法弄明白。 readFromFile函数是由教授提供的,用于从文件中读取int,我必须修改它才能读取记录。

2 个答案:

答案 0 :(得分:0)

Record定义为

typedef struct Rec* Record;

因此它是指向struct Rec的指针。 malloc返回指向已分配内存(或NULL)的指针,但是将其转换为指向指针的指针

*data = (Record*)malloc(n * sizeof(Record));
//    =  Rec**

答案 1 :(得分:0)

之间存在很大差异:

(*data)[i].nome = malloc(sizeof(char) * MAX_LENGTH + 1);

(*data)[i]->cognome = malloc((sizeof(char) * MAX_LENGTH + 1));

使用点符号的第一行暗示访问struct的成员,而 - &gt;意味着使用指针表示法访问struct的成员,即指向结构的指针。

混淆显示在那里,因为(*data)是指向Record类型结构的指针,它是Rec的类型定义。

typedef struct Rec* Record; 

自从data被剥离后,是Record的类型定义,别名为指向Rec结构的指针。作为参数的一部分的双指针,将通过引用传递进行修改,在确定输入数据集中的行数后,声明为指针数组:

*data = (Record*)malloc(n * sizeof(Record));

访问成员数据,对于数组中的每个条目将是:

(*data)[i] dot name_of_member

如果类型定义如下,则规则会发生变化:

typedef struct Rec Record;

即。一个普通的结构,没有指针使用。

然后访问会员数据,,如果分配,

(*data)[i]->name_of_member

然而,不要尝试在typedef 后面隐藏指针,因为这会让人感到悲伤,将来再次回到代码中,并想知道它失败的原因,隐藏指针有咬你了!