正确的复制char指针数组的方法?

时间:2012-03-02 09:54:30

标签: c memory

任务:

我在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时,我会看到所有记录,但有些记录有 已被不正确的值替换。我不确定我错过了什么。

2 个答案:

答案 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的回答告诉您如何安全地复制实际记录。