-2

如果我想返回一个空的char*,我可以这样做

char* Fun1(void) {
 return "";
}

现在想象一下同样的问题char**,我想返回一个空数组char*

有没有更短的方法来写这个而不使用临时变量?

char** Fun2(void) {
 char* temp[1] = {""}; 
 return temp;
 // return {""}; // syntax error !
}

NULL目标是隐藏字符串可以是指针的事实。

4

6 回答 6

2

相当于你对字符串文字所做的事情是这样的:

char const* const* Fun2(void) {
    static char const* const tmp[] = {""};
    return tmp;
}

但正如我在对该问题的评论中所说,您可能需要重新考虑“空”的含义。

您还需要考虑如果在某些情况下退货不为空,您将要做什么。如果调用者应该释放返回的指针,那么返回指向字符串文字和/或静态数组的指针就不行了。

于 2012-06-20T08:46:38.717 回答
1

首先,从刚刚分配的函数返回指针不是一个好主意。问题是用户必须释放该内存,因此您强制他们使用与您相同的内存管理功能。

考虑到这一点,您想在此处分配 2 位内存:一个用于指向字符的指针,另一个用于字符本身。

char** p = malloc(sizeof(*p));
*p = malloc(sizeof(**p));
**p = '\0';
return p;

然后记住用户必须这样做:

free(*p);
free(p);

但我再说一遍,你做的不是好的编程。您最好编写接受空指针的函数。

于 2012-06-20T08:45:02.083 回答
1

不要使用临时变量,因为它会在返回时超出范围。如果您有多个函数返回相同的空数组,它们可以返回指向同一个“空数组”的指针。

char* EmptyArray[1] = {""}; 

char** Fun2(void) 
{
  return EmptyArray;
}

此外,这使得通过比较指针可以很容易地检测函数是否专门返回空:-

char **arr =  Fun2(); 

if (arr == EmptyArray)
  ...
于 2012-06-20T08:49:53.470 回答
0

你不能只返回 null,因为 null 是空指针吗?

于 2012-06-20T08:38:35.957 回答
0

{""}only 可用于在其定义处初始化变量。但不能作为表达式,也就是说,你不能像这样使用它

char* temp[1];
temp = {""}; // invalid
于 2012-06-20T08:42:38.727 回答
0

第一种情况很好,""从函数返回的字符串文字是安全的。对于第二种情况,您需要一个长度为 1 的数组,其中包含一个指向空字符串的指针,您可以做一些诡计:

char ** array_empty_if_null(const char **array)
{
  static char *empty[] = { "" };

  return (array == NULL || array[0] == NULL) ? empty : array;
}

我认为这符合您对所需内容的描述。

于 2012-06-20T08:49:30.540 回答