【发布时间】:2015-09-12 22:15:07
【问题描述】:
我知道你可以从函数中返回一种指针。
前任。 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) 将 ttmp2=blocks; 添加到 findBlock2() 的顶部会删除两个段错误。
(2) return ((tmp2+i)+j); 展示了如何操作指向 ptr-to-ptr 或 2D 数组的 ptr-to-ptr
(3) printf("%d\n", *( (*(tmp2+i)) +j) ); 展示了如何执行 (2) 并取消引用它。
希望对他人有所帮助
【问题讨论】:
-
你的意思是指向函数指针的指针吗?还是给出的答案是您想要的?
-
答案是肯定的,但是您可能有一个相关的编码问题正在尝试解决,所以发布您的代码和具体问题,您会得到比刚才更好的答案是 + 几个很可能与您的问题无关的示例。
-
你们两个是对的,让我更新我的问题。 :)
-
使用
[ ]表示法而不是*((*((s)+(y))+1)或其他,更容易阅读 -
你得到一个段错误,因为你从来没有在任何地方指向
tmp2,但是你在findBlock2中取消引用它