Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回一个空的字符数组*_C_Arrays_String - Fatal编程技术网

C 返回一个空的字符数组*

C 返回一个空的字符数组*,c,arrays,string,C,Arrays,String,如果我想返回一个空的字符*,我可以这样做 char* Fun1(void) { return ""; } 现在想象一下char**的同样问题,我想返回一个空的char*数组 有没有一种不使用临时变量的更短的方法来写这个 char** Fun2(void) { char* temp[1] = {""}; return temp; // return {""}; // syntax error ! } 目标是隐藏字符串可以是NULL指针这一事实。您不能只返回NULL,因为NULL是空指

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

char* Fun1(void) {
 return "";
}
现在想象一下
char**
的同样问题,我想返回一个空的
char*
数组

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

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

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

您不能只返回NULL,因为NULL是空指针吗?

只能使用
{'}
在变量定义处初始化变量。但不是作为一个表达,也就是说,你不能像这样使用它

char* temp[1];
temp = {""}; // invalid

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

考虑到这一点,您希望在这里分配2位内存:一位用于指向字符的指针,另一位用于字符本身

char** p = malloc(sizeof(*p));
*p = malloc(sizeof(**p));
**p = '\0';
return p;
然后请记住,用户必须执行以下操作:

free(*p);
free(p);

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

与您使用字符串文字所做的等效操作如下:

char const* const* Fun2(void) {
    static char const* const tmp[] = {""};
    return tmp;
}
但正如我在对问题的评论中所说,你可能需要重新思考“空”的含义


你也需要考虑如果你的回报不是空的话你会怎么做。如果调用者应该释放返回的指针,那么返回到字符串文本和/或静态数组的指针就不存在了。

第一种情况很好,从函数返回字符串文本(如
是安全的。对于第二种情况,如果需要一个长度为1的数组,其中包含指向空字符串的指针,则可以使用一些技巧:

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

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

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

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

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

char** Fun2(void) 
{
  return EmptyArray;
}
此外,通过比较指针,可以很容易地检测函数是否专门返回空值:-

char **arr =  Fun2(); 

if (arr == EmptyArray)
  ...

我还有其他使用Fun1和Fun2的代码部分,它们在使用NULL值时表现不好。因此,我想将此错误处理隐藏在Fun1和Fun2中。您的
Func2
将导致未定义的行为,因为您返回指向局部变量的指针,这在函数返回后无效。此外,您返回指向局部变量的指针是不允许的,您试图返回的数组实际上不是空的(它包含一个空字符串)。我不明白你想在这里做什么。你说,“我想返回一个空数组”,但你的代码实际上返回一个(指向一个)非空数组,带有1个元素,这是一个空字符串。我认为首先你必须决定“空”对你来说意味着什么。一旦你这样做了,你可能会在代码的其他地方做一些改变,使这个问题变得无关紧要。老兄,你很清楚我的意思…@John:我理解你的要求,但我不确定你的要求是否明智:-)如果你写的代码采用数组,在不同情况下可能有不同的长度,然后,几乎总是可以确保代码使用空数组(即长度为0的数组)。一旦代码使用长度为0的数组,它将使用空指针,程序的这一部分将变得更容易。例如,每次我打印某个东西时,我都必须检查它是否为空?返回指向未被malloc'd(并且不需要)的指针是惯用的C编程。想想C字符串函数-
strchr
strcpy
,等等。。。等等,@John:Mat建议
char**
为空。为什么要将
char**
传递给printf,而当传递时,它是否为null又有什么关系呢?@Mat,是的-但我怀疑缺少const不是出于设计;-)@罗迪,我完全同意。但我也认为无论哪种方法都是完全错误的,返回null总是更好。这对于我想要做的事情来说似乎太复杂了+它使用了一个临时变量。我想用一行来说明这一点。我认为您低估了C语言中的内存管理有多么复杂。无论如何,C语言中字符串和数组的区别在于,字符串文字的使用期限与程序运行的时间相同,而C99数组文字的使用期限仅与它们在其中使用的表达式相同,因此,它们不适合从函数返回(而且C89根本没有数组文本)。我不认为你想要的是可能的。@JohnPoe,为什么你用多少行都很重要?如果你想要一条线的解决方案,你使用了错误的语言。我是在这里提问的人。请更具建设性。