请考虑以下示例
char** make_copy(int argc, char** argv){
char** new_argv = malloc((argc+1) * sizeof *new_argv);
for(int i = 0; i < argc; ++i)
{
size_t length = strlen(argv[i])+1;
new_argv[i] = malloc(length);
memcpy(new_argv[i], argv[i], length);
}
new_argv[argc] = NULL;
return new_argv;
}
上述函数分配内存以进行复制
void free_space(**args, ...){
// how to do ?
}
int main(){
char** string1 = make_copy(); # make a copy of some string
char** string2 = make_copy(); # make a copy of another string
char** string3 = make_copy(); # make a copy of third string
free_space(string1, string2, string3, NULL);
}
在不对传递变量的数目做任何假设的情况下,释放错位空间的最有效方法是什么?
3条答案
按热度按时间fdx2calv1#
宏可以发送一个伪参数和一个最终的
NULL
,然后在函数中使用一个va_list
:或者,如果你愿意,你也可以把一个复合字面值传递给一个期待指针数组的函数(优点是编译器可以进行类型检查):
如果你想隐藏复合文本的构造,代价是用宏混淆代码:
hrirmatl2#
您需要使用一个sentinel value来标记变量参数列表的结尾:
用法:
唯一需要注意的是,你不能用这种方式传递
NULL
指针,因为NULL
表示变量参数列表的末尾。不会释放
string2
。bz4sfanl3#
你必须迭代参数并一个接一个地释放它们。我会这样做: