我想删除一个字符串数组的第i个成员,并将之后的每个成员带到一个位置(第i + 1个成员到i,依此类推)。我想出了以下代码:
for (int j = i; j < arrSize - 1; j++) {
strcpy(members[j],members[j+1]);
}
free(members[arrSize-1]);
但这让我觉得它可能是错的。例如,如果第i个地方成员包含名称&#34; John&#34;,而第(i + 1)个地方成员包含名称&#34; Joshua&#34;,这意味着每个字符串是在不同的长度,会有任何内存泄漏或任何问题?提前谢谢!
编辑:成员的定义:
members = malloc(maxMembersNum * sizeof(char*));
答案 0 :(得分:1)
为什么不移动指针,而不是复制字符串的内容?那就是:
for (int j = i; j < arrSize - 1; j++) {
char *temp = members[j];
members[j] = members[j+1];
members[j+1] = temp;
}
free(members[arrSize-1]);
答案 1 :(得分:1)
正如评论所说,成员的定义决定了功能的结果。
如果是:
char* members[];
然后它是一个指针数组,使用strcpy将覆盖内存,除非所有这些缓冲区都被分配并且大小相同,否则最终会崩溃。在这种情况下,您只需使用
复制指针即可members[j] = members[j+1]
如果是:
std::string members[];
然后你可以将它视为普通数组并省去strcpy和free(只需使用=)。
如果是:
char成员[80] [80]; //固定大小的预分配缓冲区
那么你的代码就可以了,但是免费的不会。
答案 2 :(得分:-1)
如果lines和arrSize是一个你可以作为一个单元传入的结构的成员,但是没有这个会更简单:
void remove_by_index(char **lines, int line, int *arrSize) {
if (line >= *arrSize) return;
*arrSize -= 1;
if (lines[line]) free(lines[line]);
memmove(lines + line, lines + line + 1, ((*arrSize - line) * sizeof(char *)));
lines[*arrSize] = NULL;
}
严格来说,arrSize
必须更改以反映删除,否则删除的单元格必须标记为NULL,但不必像我在此处所做的那样同时执行这两项操作(尽管它& #39;这不是一个坏主意。)
另请注意,如果数组的两个成员指向同一个字符串,这将失败,这里的其他答案也是如此 - 因为您需要更复杂的数据结构。