返回一个空数组的char *

时间:2012-06-20 08:36:44

标签: c arrays string

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

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

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

在不使用临时变量的情况下编写此文件有更短的方法吗?

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

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

6 个答案:

答案 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;
}

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