我知道您可以从函数返回一种类型的指针。
前任。 void *foo()你能在函数中返回一种指向指针的指针吗?
前任。 void **foo2()
这是有关我的问题的更多信息:

我尝试将 ptr-to-ptr tmp2 分配给 blocks[i][j],然后返回 tmp2。 blocks[i][j] 也是一个ptr-to-ptr。

我很困惑将 ptr 操作为 ptr-to-ptr:我不确定 return ((tmp2+i)+j); 是否是 printf("2---%d\n", **tmpPtr2); 行段错误的原因。为了调试,我尝试打印: printf("%d\n", *( (*(tmp2+i)) +j) ); 但是,它会导致新的段错误。

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

int **blocks, **tmp2;
int n = 10;

int **findBlock2(int b){
    int i, j ;

    for (i=0; i<n; i++){
        for (j=0; j<n; j++){
            if (blocks[i][j]==b){
                printf("%d\n", blocks[i][j]);

                //Segmentation fault
                printf("%d\n", *((*(tmp2+i))+j) );

                return ((tmp2+i)+j);
            }
        }
    }
    return NULL;
}

int main(int argc, const char * argv[]) {
    int i, j;
    int **tmpPtr2;

    //allocate memory space and assign a block to each index
    blocks=malloc(n * sizeof *blocks);
    for (i=0; i<n; i++) {
        blocks[i]=malloc(n * sizeof(*blocks[i]));
        blocks[i][0]=i;
    }

    if ((tmpPtr2=findBlock2(4))==NULL)    return -1;

    //Segmentation Fault
    printf("2---%d\n", **tmpPtr2);

    return 0;
}

更新回答我的问题:

(1) 在 findBlock2() 的顶部添加 t tmp2=blocks; 删除了两个段错误。

(2) return ((tmp2+i)+j); 显示了如何操作指向 ptr-to-ptr 或 2D 数组的 ptr-to-ptr

(3) printf("%d\n", *( (*(tmp2+i)) +j) ); 显示了如何执行 (2) 并取消引用它。

希望它能帮助别人

最佳答案

是的,就像使用任何指针变量一样。

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

int ** function(){
    int ** matrix = malloc(sizeof(int*));
    *matrix = malloc(sizeof(int));
    matrix[0][0] = 5;
    return matrix;
}

int main()
{
    int **matrix = function();
    printf("%d",matrix[0][0]);
    free(matrix[0]);
    free(matrix);
    return 0;
}

添加到另一部分。在您的函数 findBlock2 中,除了访问已经指出的无效引用之外,您的目标似乎是返回对满足 if 语句的块的引用。如果是这种情况,则返回指向 int* 的指针就足够了。
int *findBlock2( int b )
/////////////////
return ( *(blocks+i)+j );

关于你能在函数中返回一种指向指针的指针吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31065039/

10-17 01:27