C专家编程 第10章 再论指针 10.6 使用指针从函数返回一个数组

发布于:2022-12-21 ⋅ 阅读:(158) ⋅ 点赞:(0)

    使用指针从函数返回一个数组
    严格地说,无法直接从函数返回一个数组。但是,可以让函数返回一个指向任何数据结构的指针,当然也可以返回一个指向数组的指针。记住,声明必须在使用之前。一个声明的例子是:
    int (*paf(void))[20];
    这里,paf是一个函数,它返回一个指向包含20个int元素的数组的指针。它的定义可能如下:
    int (*paf())[20] {
        int (*pear)[20];      /*声明一个指向包含20个int元素的数组的指针*/ 
        pear = calloc(20, sizeof(int));
        if (!pear) {
            longjmp(error, 1);
        }
        return pear;
    } 

    /*
    ** return the pointer points to function. 
    */
    #include <stdio.h>
    #include <stdlib.h>

    int (*paf())[20] {
        int (*pear)[20]; /*声明一个指向包含20个int元素的数组的指针*/
        pear = (int (*)[20])calloc(20, sizeof(int));
        if( !pear ) {
            printf( "memory allocation fails!\n" );
        } else{
            printf( "memory allocation succeed!\n" );
        }
        return pear;
    }

    int main( void ){
        int (*pf)[20] = paf();
        free( pf );
    
        return EXIT_SUCCESS;
    }

输出:

    你用下面这样的方法来调用函数:
    int (*result)[20]; /*声明一个指向包含20个int元素的数组的指针*/
    ...
    result = paf();     /*调用数组*/
    (*result)[3] = 12; /*访问结果数组*/
    或者玩个花样,定义一个结构:
    struct a_tag{
        int array[20];
    }x, y;
    struct a_tag my_function() {
        ...return y;
    } 
    用下面的方法来调用:
    x = y;
    x = my_function();
    如果要访问数组中的元素,可以用下面的方法:
    x.array[i] = 38;
    千万要注意,不能从函数中返回一个指向函数的局部变量的指针。

    为什么NULL指针会导致printf函数崩溃?
    有一个经常被问到的问题是:“为什么向printf()函数传递一个NULL指针会导致程序崩溃?”
    人们似乎觉得可以像下面这样编写代码:
    char *p = NULL;
    /* ... */
    printf("%s", p);
    问题在于C标准规定%s说明符的参数必须是一个指向字符数组的指针。由于NULL并不是这样的指针(它是一个指针,但它并不指向一个字符数组),所以这个调用将陷入“未定义行为”。
    由于程序员在编码时出现了一些错误,问题是“你是希望尽早还是尽晚发现错误?”。


网站公告

今日签到

点亮在社区的每一天
去签到