-1

我一直认为,当您想从函数返回数组时,唯一的方法是使用如下指针: char * func();

但是昨天,当我浏览 K&R 时,我注意到 错误地认为char x()[]也是一个有效的结构。所以我继续测试它并编写了以下代码:

#include <stdio.h>
#include <stdlib.h>

char string1[10] = "123456789";


char x(void)[10];

int main(void) {
    printf("string returned by x() is %s",x());
    return EXIT_SUCCESS;
}

char x(void)[10] {
    return x;
}

在 Windows 上使用 GCC 编译,这引发了以下错误:

..\src\07arrreturn.c:7:6: error: 'x' declared as function returning an array
..\src\07arrreturn.c: In function 'main':
..\src\07arrreturn.c:10:2: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat]
..\src\07arrreturn.c: At top level:
..\src\07arrreturn.c:14:6: error: 'x' declared as function returning an array
..\src\07arrreturn.c: In function 'x':
..\src\07arrreturn.c:15:2: warning: return makes integer from pointer without a cast [enabled by default]

怎么了?我是不是误解了书上的内容?如何从一个函数返回多个值(或地址)?这不是因为您只有一个可以保存返回值的有限大小的 CPU 寄存器这一事实而受到限制吗?如果你必须返回一大块数据,你只能通过返回地址来做到这一点,对吧?

char x()[] 是怎么回事?这样的东西还用吗?

编辑:事实上,我确实误读了 K&R 的内容。请参阅下面的评论。

4

3 回答 3

6

char x()[]也是一个有效的构造

不是原样,在这种情况下也不完全是。

您可以使用类似的语法:

  • 声明一个指向数组的指针:char (*arrPtr)[20];

  • 声明一个函数指针数组:void (*foo[20])(void);

  • 取消引用函数调用的返回值(指针):char *foo(); char c = foo()[0];

  • 声明一个返回数组指针的函数:char (*foo())[20]

  • 或与函数指针相同的东西:char (*(*foo)())[20]

您在寻找其中哪一个?

于 2013-05-24T06:16:27.070 回答
5

C 标准 (ISO/IEC 9899:2011) 明确表示:

6.7.6.3 函数声明器(包括原型)

约束
1 函数声明器不得指定函数类型或数组类型的返回类型。

因此,您的代码无效。

于 2013-05-24T06:15:27.397 回答
3

K&R C 已经很老了。在 ANSI C (C89) 中,函数返回数组是不允许的,你看到的就是这个结果。首先,声明x()为返回数组的函数时会出错,并且由于此错误,x()永远不会正确声明,因此被视为返回 an 的函数int(因为这曾经是默认返回类型)。这个返回的 int 然后应该被解释为char *生成最终警告。

如果你需要返回一个数组,你可以将它包装在一个结构体中。否则返回一个指针(确保返回后它指向的内存是有效的)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char string1[10] = "123456789";

struct ret_s {
    char string1[10];
};

struct ret_s x(void);

int main(void) {
    struct ret_s r = x();
    printf("string returned by x() is %s\n", r.string1);
    return EXIT_SUCCESS;
}

struct ret_s x(void) {
    struct ret_s r;
    strcpy(r.string1, string1);
    return r;
}
于 2013-05-24T06:17:38.530 回答