-1

ポインタに値を割り当てたいとします。

int **a;

int** function(x){
  int **b;
  ...
  return b;
}

出来ますか?

a=function(x);

私は混乱しています。それについて教えてください。すべての行をチェックしましたが、ポインタの割り当てだけが間違っているようです。それで、ここに問題コードがあります(見るのは複雑かもしれませんが、コメントで単純化しています。コメントを見てください):

  int* side_x_y(int ndx, int ndy,int flag_right_0_left_1_2,int flag_up_0_down_1_2){
    int * node_number=(int*)malloc(sizeof(int)*(ndx*ndy*2+1));/// ***this pointer returns to segment_matrix function***///////
    for(int i=1;i<=ndx*ndy*2;i++){
        node_number[i]=0;
        }
    //int node_number[ndx+ndy]={};
    //memset ( node_number, 0, (ndx+ndy)*sizeof (int) );
    if(flag_up_0_down_1_2==0){
        for(int i=1;i<=ndx;i++){
            node_number[i]=i;
        }
    }
    if(flag_up_0_down_1_2==1){
        for(int i=1;i<=ndx;i++){
            node_number[i]=(ndy-1)*ndx+1+i;
        }
    }
    if(flag_right_0_left_1_2==0){
        for(int i=1;i<=ndy;i++){
            node_number[i]=ndx*i;
        }
    }
    if(flag_right_0_left_1_2==0){
        for(int i=1;i<=ndy;i++){
            node_number[i]=1+ndx*(i-1);
        }
    }
    return node_number;
    }
int** segment_matrix(int ndx,int ndy){
    int *nodes;
    nodes=side_x_y(ndx, ndy,1,2);////*** here i have used nodes pointer***//// it returns only 1 where it should not be one///
    //for(int i=0;i<ndy;i++)
    //printf("%d",nodes[i]);
    int ns=ndy-1;
    int **segment=(int**)malloc(sizeof(int)*(ns+1));
    for(int s=1;s<=ns;s++){
        segment[s]=(int*)malloc(sizeof(int)*(2+1));
    }
    int kk=0;
    for(int s=1;s<=ns;s++){
        for(int i=1;i<=2;i++){
        segment[s][i]=nodes[kk];
        kk++;
        if(i==2){
            kk--;
        }
        }
    }
    return segment;
}

主な機能の内部:

    int **nss;
nss=segment_matrix(ndx,ndy);////*** it is the most confusing part***/// please see
//printf("%d",nss[0][0]);
int Ns=ndy-1;
double bv_T_g=0;
double bv_T_q=0;
Complex *gamma=(Complex*)malloc(sizeof(Complex)*(Ns+1));
Complex *q=(Complex*)malloc(sizeof(Complex)*(Ns+1));
for(int i=1;i<=Ns;i++){
    gamma[i]=assign_complex(bv_T_g,0);
    q[i]=assign_complex(bv_T_q,0);
}
int** ns=(int**)malloc(sizeof(int*)*(Ns+1));
for(int i=1;i<=Ns;i++){
    ns[i]=(int*)malloc(sizeof(int)*(2+1));
}
for(int i=1;i<=Ns;i++){
    for(int j=1;j<=2;j++){
        ns[i][j]=0;
    }
}
4

3 に答える 3

2

書かれているようにコードは不明確ですが、関数内で代入された値が安全であれば問題ない可能b性があります。たとえば、 で整数ポインタの配列を割り当てた場合calloc()、コードは問題ありません。

int **function(size_t x)
{
    int **b = calloc(x * sizeof(*b));
    if (b == 0)
        ...report error...
    return b;
}

...
a = function(23);

安全ではないのは、次のようなローカル変数へのポインターを返すことです。

int **function(size_t x)
{
    int *array[23];
    int **b = array;
    return b;         // Undefined behaviour
}
于 2011-10-04T06:15:20.727 に答える
1

はい、可能です。なぜあなたは混乱しているのですか?

于 2011-10-04T06:11:51.380 に答える
0

はい。 (質問に対する簡潔で簡単な回答)

更新後:

1番の間違いは

 int **segment=(int**)malloc(sizeof(int)*(ns+1));
    for(int s=1;s<=ns;s++){
        segment[s]=(int*)malloc(sizeof(int)*(2+1));

あるべきだと思う

 int **segment=(int**)malloc(sizeof(int*)*(ns+1));

変化

sizeof(int)--> sizeof(int*)

2>メイン()で

nss=segment_matrix(ndx,ndy);

これ以上使用していないこの関数の出力を取得してnssいますか??

3>

   if(flag_right_0_left_1_2==0){
        for(int i=1;i<=ndy;i++){
            node_number[i]=1+ndx*(i-1);
        }

あなたは書くことになっています

   if(flag_right_0_left_1_2==1){
        for(int i=1;i<=ndy;i++){
            node_number[i]=1+ndx*(i-1);
        }
于 2011-10-04T06:35:35.877 に答える