如果我想返回一个空的char*
,我可以这样做
char* Fun1(void) {
return "";
}
现在想象一下同样的问题char**
,我想返回一个空数组char*
。
有没有更短的方法来写这个而不使用临时变量?
char** Fun2(void) {
char* temp[1] = {""};
return temp;
// return {""}; // syntax error !
}
NULL
目标是隐藏字符串可以是指针的事实。
相当于你对字符串文字所做的事情是这样的:
char const* const* Fun2(void) {
static char const* const tmp[] = {""};
return tmp;
}
但正如我在对该问题的评论中所说,您可能需要重新考虑“空”的含义。
您还需要考虑如果在某些情况下退货不为空,您将要做什么。如果调用者应该释放返回的指针,那么返回指向字符串文字和/或静态数组的指针就不行了。
首先,从刚刚分配的函数返回指针不是一个好主意。问题是用户必须释放该内存,因此您强制他们使用与您相同的内存管理功能。
考虑到这一点,您想在此处分配 2 位内存:一个用于指向字符的指针,另一个用于字符本身。
char** p = malloc(sizeof(*p));
*p = malloc(sizeof(**p));
**p = '\0';
return p;
然后记住用户必须这样做:
free(*p);
free(p);
但我再说一遍,你做的不是好的编程。您最好编写接受空指针的函数。
不要使用临时变量,因为它会在返回时超出范围。如果您有多个函数返回相同的空数组,它们可以返回指向同一个“空数组”的指针。
char* EmptyArray[1] = {""};
char** Fun2(void)
{
return EmptyArray;
}
此外,这使得通过比较指针可以很容易地检测函数是否专门返回空:-
char **arr = Fun2();
if (arr == EmptyArray)
...
你不能只返回 null,因为 null 是空指针吗?
{""}
only 可用于在其定义处初始化变量。但不能作为表达式,也就是说,你不能像这样使用它
char* temp[1];
temp = {""}; // invalid
第一种情况很好,""
从函数返回的字符串文字是安全的。对于第二种情况,您需要一个长度为 1 的数组,其中包含一个指向空字符串的指针,您可以做一些诡计:
char ** array_empty_if_null(const char **array)
{
static char *empty[] = { "" };
return (array == NULL || array[0] == NULL) ? empty : array;
}
我认为这符合您对所需内容的描述。