任务:
我在filtered_records
中有一系列记录,其中包含过滤记录的数量
num_filtered_records
。我想在binfo->filtered_records
中复制此信息
和binfo->num_filtered_records
,因为我的代码后面会filtered_records
免费提供。
解释
char** filtered_records;
size_t num_filtered_records;
段:
binfo->filtered_records = malloc(num_filtered_records*sizeof(char*));
memcpy(binfo->filtered_records,
filtered_records,
num_filtered_records * sizeof(char*));
问题:
当我打印binfo->filtered_records
时,我会看到所有记录,但有些记录有
已被不正确的值替换。我不确定我错过了什么。
答案 0 :(得分:4)
您正在做的事情并不重复实际数据,它只是复制指针。而不是memcpy
,而是为:
for (i = 0; i < num_filtered_records; i++)
binfo->filtered_records[i] = strdup(filtered_records[i]);
如果您没有strdup
,请使用malloc(strlen(filtered_records[i]) + 1)
,然后使用strcpy
。
答案 1 :(得分:3)
您正在将指针数组复制到每个值,但您没有复制实际值。因此,记录本身发生的任何更改都将反映在原始filtered_records
和新binfo->filtered_records
中。
如果您在复制后释放filtered_records
中每条记录的内存,则binfo->filtered_records
中的所有条目现在指向无效内存。
cnicutar的回答告诉您如何安全地复制实际记录。