将行存储到动态结构中

时间:2011-07-26 21:06:28

标签: c memory dynamic stdin

我正在编写一个函数来存储来自stdin的行,并在结构中为它动态分配内存。当我编译我的代码时,我得到3个错误,我不知道为什么我会收到这些错误。

错误如下:

error: incompatible types in assignment
error: incompatible type for argument 1 of `strcpy'
error: incompatible type for argument 1 of `free'

这是功能:

#define NAMESIZE 20
#define BLOCK 2
typedef struct
{
char last[NAMESIZE];
char first[NAMESIZE];
}name;

typedef struct
{
int id;
name name;
float score;
}record;

typedef struct
{
record *data;
size_t nalloc;
size_t nused;
}record_list;


int list_insert(record_list *list, const record *rec)
{
char * temp;
char lines[512];
size_t i;
list->nalloc = 0;
list->nused = 0;

while(fgets(lines, 512, stdin))
{
    if(list->nalloc == list->nused)
    {
        temp = realloc(list->data, (list->nalloc + BLOCK) * sizeof(char *));

        if(temp == 0)
        {
            fprintf(stderr, "Unable to resize memory\n");
            break;
        }

        list->data = (record *)temp;
        list->nalloc += BLOCK;
    }
    list->data[list->nused] = malloc(strlen(lines) + 1); /*problem line*/
    strcpy(list->data[list->nused++], lines);/*problem line*/

}
for(i = 0; i < list->nused; i++)
{
    free(list->data[i]); /*problem line*/
}
free(list->data);


return 0;
}

任何帮助都会被指定。

3 个答案:

答案 0 :(得分:1)

list->data是指向record的指针,因此list->data[i]的类型为record。您的所有问题行都需要char *或至少某种指针,这会导致错误消息。

答案 1 :(得分:1)

您的代码似乎使用list->data[i]作为指针,但由于list->datarecord*,因此list->data[i]record,而不是record* 1}}。

使用您当前的数据结构,只需要一个malloc / free对;除list->data之外的所有内容都具有已知且恒定的长度。

现在你的realloc确实是错误的,你需要分配sizeof (*list->data)的倍数(即sizeof (record))。如果对realloc的第一次调用返回null,那么你的代码也将失败(你正在打破循环并尝试释放list->data,这里可能为null)。

答案 2 :(得分:1)

list->data[list->nused] = malloc(strlen(lines) + 1);

list->data的类型为record *,但您要解决此问题(使用[list-nused]),以便list->data[list->nused]的类型为record,并指定指向它的指针。为此,data中的record_list结构成员必须是指向指针的指针。

此外,您希望为字符串分配内存(因为您分配了strlen(lines) + 1个字节)。但是你没有任何变量来存储字符串:record有一个int,一个float和两个字符数组,它们有固定的大小。

你可能想要的是这样的:

typedef struct {
    int id;
    char *name;
    float score;
} record;

...
temp = realloc(list->data, list->nalloc * sizeof(record));
...
list->data[list->nused].name = malloc(strlen(lines) + 1);
strcpy(list->data[list->nused++].name, lines);
...
free(list->data[i].name);

所以你分配记录(int,char指针,浮点数),以及char指针所在的位置,为字符串分配内存。