我正在编写一个函数来存储来自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;
}
任何帮助都会被指定。
答案 0 :(得分:1)
list->data
是指向record
的指针,因此list->data[i]
的类型为record
。您的所有问题行都需要char *
或至少某种指针,这会导致错误消息。
答案 1 :(得分:1)
您的代码似乎使用list->data[i]
作为指针,但由于list->data
是record*
,因此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指针所在的位置,为字符串分配内存。