通过一次malloc生成char**的方法
看到类似这样的代码。
char **arr; int len; arr = produce_array(&len); /* 此时生成了有len个元素的含有内容的数组。用一次free来释放? */ free(arr);
原来看到free()那里,觉得会有问题,我的想法是要为每一个char *分别malloc内存,所以需要有len次free。其实不然,C语言太灵活了,不要被自己原来固有的想法束缚了才好。完全可以通过一次malloc申请到所有的空间,再活用这些空间。
/* 设有 n 个以 NULL 结尾的字符串放在 data 中,它们的总长为 dlen */
char **produce_array(int *len)
{
char **ret;
int i;
*len = n;
ret = malloc(sizeof(char *) * n + dlen);
ret[0] = (char *)(ret + n);
memcpy(ret[0], data, dlen);
for (i = 1; i < n; i++)
ret[i] = ret[i-1] + strlen(ret[i-1]) + 1;
return ret;
}
© 2010, liuw. All rights reserved.