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