C 将行存储到动态结构中

C 将行存储到动态结构中,c,memory,dynamic,stdin,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 #

我正在编写一个函数,它存储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;
}
#定义名称20
#定义块2
类型定义结构
{
最后一个字符[命名];
字符优先[命名];
}姓名;
类型定义结构
{
int-id;
姓名;
浮点数;
}记录;
类型定义结构
{
记录*数据;
大小;
使用的尺寸;
}记录表;
整数列表插入(记录列表*列表,常量记录*记录)
{
字符*温度;
字符行[512];
尺寸i;
列表->nalloc=0;
list->nused=0;
而(fgets(第512行,标准输入))
{
如果(列表->nalloc==列表->已使用)
{
temp=realloc(列表->数据,(列表->nalloc+块)*sizeof(字符*);
如果(温度==0)
{
fprintf(stderr,“无法调整内存大小\n”);
打破
}
列表->数据=(记录*)温度;
列表->nalloc+=块;
}
列表->数据[列表->使用]=malloc(strlen(行)+1);/*问题行*/
strcpy(list->data[list->nused++],行);/*问题行*/
}
对于(i=0;inused;i++)
{
自由(列表->数据[i]);/*问题行*/
}
免费(列表->数据);
返回0;
}

任何帮助都会被显示。

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

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

你的代码似乎使用
list->data[i]
作为指针,但既然
list->data
是一个
记录*
,那么
list->data[i]
就是一个
记录
,而不是
记录*

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


现在您的realloc确实错误了,您需要分配一个倍数
sizeof(*list->data)
(即
sizeof(record)
)。如果对realloc的第一次调用返回null,您的代码也将失败(您正在跳出循环并尝试释放
list->data
,此处可能为null)。

您的代码似乎使用
list->data[i]
作为指针,但由于
list->data
记录*
,那么
list->data[i]
是一条
记录
,而不是
记录*

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

现在您的realloc确实错误了,您需要分配一个倍数
sizeof(*list->data)
(即
sizeof(record)
)。如果对realloc的第一次调用返回null,您的代码也将失败(您正在中断循环并尝试释放
list->data
,此处可能为null)

list->data
的类型为
record*
,但您可以对其进行寻址(使用
[list-nused]
),因此
list->data[list->nused]
的类型为
record
,并为其指定一个指针。要使其正常工作,
记录列表
中的
数据
结构成员必须是指向指针的指针

此外,还需要为字符串分配内存(因为您分配
strlen(行)+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指针、float),在char指针所在的位置,为字符串分配内存

list->data
的类型为
record*
,但您可以对其进行寻址(使用
[list-nused]
),因此
list->data[list->nused]
的类型为
record
,并为其指定一个指针。要使其正常工作,
记录列表
中的
数据
结构成员必须是指向指针的指针

此外,还需要为字符串分配内存(因为您分配
strlen(行)+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指针、float),并在char指针所在的位置为字符串分配内存。

无法真正更改结构。有其他选择吗?如果使用当前结构,则不需要为字符串动态分配内存,您已经有了缓冲区(最后一个和第一个)。然后您只需执行realloc(),no malloc(),并将字符串复制到&list->data[list->nused++]。最后。无法真正更改结构。有其他选择吗?如果使用当前结构,则不需要为字符串动态分配内存,您已经有了缓冲区(最后一个和第一个)。然后只需执行realloc(),no malloc(),并将字符串复制到&list->data[list->nused++]。