将指针返回数组的函数

美智

我成功地使用了可变长度数组C,现在有了以下内容:

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

int (*foo(size_t row, size_t col))[3];

int main(void){
    size_t row, col;


    printf("Give the ROW: ");
    if ( scanf("%zu",&row) != 1){
        printf("Error, scanf ROW\n");
        exit(1);
    }

    printf("Give the COL: ");
    if ( scanf("%zu",&col) != 1){
        printf("Error, scanf COL\n");
        exit(2);
    }

    int (*arr)[col] = foo(row, col);

    for ( size_t i = 0; i < row; i++){
        for( size_t j = 0; j < col; j++){
            printf("%d ",*(*(arr+i)+j));
        }
    }

    free(arr);
}


int (*foo(size_t row, size_t col))[3]{
    int (*arr)[col] = malloc(row * col * sizeof(int));
    int l=0;

    if (arr == NULL){
        printf("Error, malloc\n");
        exit(3);
    }

    for ( size_t i = 0; i < row; i++){
        for( size_t j = 0; j < col; j++){
            *(*(arr+i)+j) = l;
            l++;
        }
    }

    return arr;
}

输出:

Give the ROW: 2
Give the COL: 5
0 1 2 3 4 5 6 7 8 9

现在这个:

int (*foo(size_t row, size_t col))[3]{ /* code */ }

意味着,如果我理解正确,那就将foo声明为具有两个参数(size_t行,size_t col)的函数,该参数返回指向int数组3的指针。

我并不完全能够理解这种函数,并且对我来说,现在仅在运行时知道大小的情况下,使用可变长度数组对我来说更为复杂,但是我发现这是一件好事。我只使用C11标准。

无论如何,int (*foo(size_t row, size_t col))[3]我都有这个[3],我不清楚它是如何工作的以及如何在运行时(当然,只有在可能的情况下)使其成为可能,例如int (*foo(size_t row, size_t col))[SIZE]

我读了一些有关的书C,但是没有关于这种情况的确切解释,Google也没有帮助,所以我有两个问题:

1)这int (*foo(size_t row, size_t col))[SIZE]可能吗,必须将SIZE作为参数?还是我应该以其他方式声明此功能?

2)这是我在这里尝试过的正确方法,还是有另一种选择?

我只是试图返回一个指向在运行时知道大小而不是在编译时知道大小的数组的指针。的通话mallocfree只发生一次,这是一个很好的方法,因为每当malloc被调用时,我们的程序干扰内核分配内存和标志页面writable.So这种方法有较少的头顶上kernel它可以malloc与VLA一起使用

编辑:

@ChronoKitsune说我应该使用/尝试[](未指定大小的数组),在这种情况下,功能将变成这样:

int (*foo(size_t row, size_t col))[]{ /* code */ }

这是我应该使用的吗?

约翰·布林格

这里任何方式int (*foo(size_t row, size_t col))[3]我有这[3]这我不清楚它是如何工作

类型声明最容易从内而外读取。我将从简单开始,并以您的示例为基础。如果你写

int foo[3];

或者

int (foo)[3];

您声明foo为3int的数组括号与表达式中一样,具有优先级排序功能,但是它们是不必要的,因为在两种情况下,对类型的解释都是相同的。

如果你写

int (*foo)[3];

您声明foo是一个指向3 ints数组的指针等效地,您可以读到说事物foo指向的是一个3 ints的数组,隐式的foo是一个指针。在这种情况下,括号是必需的;没有它们,您将声明foo为3的数组int *

如果你写

int (*foo(size_t row, size_t col))[3];

您声明的foo是一个带有两个类型为的参数的函数size_t,其返回值指向3 ints的数组

以及如何使它在运行时成为可能(当然,只有在可能的情况下),例如int (*foo(size_t row, size_t col))[SIZE]

如果SIZE不是编译时常量,则不能这样做。C2011认为

如果一个标识符被声明为具有可变修改的类型,则它应该没有链接,并且具有块作用域或函数原型作用域。[...]

(6.7.6.2/2)

换句话说,因为所有函数都有文件作用域以及内部或外部链接,所以函数返回类型不能是VLA,指向VLA的指针或任何此类类型(这些类型是“可变修改”的类型)。

通常,在这种情况下,将返回指向数组第一个元素的指针,而不是指向整个数组的指针。两种方法都指向的地址相同,但是类型不同:

int *foo(size_t row, size_t col);

返回类型不包含有关指向数组的长度的信息,但是如果C允许函数返回可变修改的类型,那么无论如何它将依赖于一种机制,通过该机制,代码可以在任何特定的上下文中知道变量的维数。换句话说,如果您不知道预期的数组长度与函数的返回类型无关,那么无论如何您都无法使用可变地修改的返回类型。

如果确实需要的功能都返回一个指针元件的运行时间确定的数目,并且还元素的数量,则可以返回同时含有结构,也可以通过指针参数返回的一个或两个的值。

更新

也可以声明您的函数以返回指向未指定大小的数组的指针,如@ChronoKitsune所建议。语法将是

int (*bar(size_t row, size_t col))[];

,但是您会发现几乎在每种方式中都很难使用该返回类型。例如,声明可以保存返回值的变量比较棘手和丑陋:

int (*array_ptr)[] = bar(x, y);

并访问指向数组的元素:

int z = (*array_ptr)[1];

对比一下

int *ptr = foo(x, y);
int w = ptr[2];

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将数组地址从函数返回到指针(C ++)

来自分类Dev

将数组地址从函数返回到指针(C ++)

来自分类Dev

函数返回的数组指针类型

来自分类Dev

函数返回数组作为指针

来自分类Dev

返回函数指针数组

来自分类Dev

从函数返回 NULL 的指针数组

来自分类Dev

如何在函数中返回指针数组?

来自分类Dev

从C ++中的函数返回指向数组的指针?

来自分类Dev

从C ++中的函数返回指向数组的指针?

来自分类Dev

从指针数组返回字符串的函数

来自分类Dev

如何从函数返回指向数组的指针?

来自分类Dev

函数返回指针与函数返回数组在C中

来自分类Dev

为什么在将指针传递给函数后访问指向多维数组的指针会返回分段错误?

来自分类Dev

如何编写将指针返回堆栈的函数

来自分类Dev

将指向数组的指针传递给函数

来自分类Dev

将“指针数组”传递给函数

来自分类Dev

将指针数组传递给函数

来自分类Dev

将char指针数组传递给函数

来自分类Dev

将char数组的指针传递给函数

来自分类Dev

将char指针数组传递给函数

来自分类Dev

将指针或数组传递给函数

来自分类Dev

将char指针/数组传递给函数

来自分类Dev

将指针数组传递给函数

来自分类Dev

C ++将指针数组传递给函数

来自分类Dev

将指针数组传递给函数

来自分类Dev

C语言如何将指针从函数返回到指针

来自分类Dev

将返回对象指针的函数强制转换为返回空指针的函数合法吗?

来自分类Dev

将SYSCALL函数存储在函数指针数组中

来自分类Dev

函数返回指向C中数组类型的指针