8

配列を指すダブルポインタから2D配列の行と列の数を取得しようとしています。

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

void get_details(int **a)
{
 int row =  ???     // how get no. of rows
 int column = ???  //  how get no. of columns
 printf("\n\n%d - %d", row,column);
}

上記の関数は、問題が発生しているサイズの詳細を出力する必要があります。

int main(int argc, char *argv[])
{
 int n = atoi(argv[1]),i,j;
 int **a =(int **)malloc(n*sizeof(int *)); // using a double pointer
 for(i=0;i<n;i++)
   a[i] = (int *)malloc(n*sizeof(int));
 printf("\nEnter %d Elements",n*n);
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
  {
   printf("\nEnter Element %dx%d : ",i,j);
   scanf("%d",&a[i][j]);
  }
 get_details(a);
 return 0;
 }

配列を作成するためにmallocを使用しています。


このようなものを使用するとどうなりますか

column = sizeof(a)/ sizeof(int)?

4

2 に答える 2

11

Cはリフレクションを行いません。

ポインターは、ポインターが指す領域のサイズを示すメタデータを格納しません。ポインタしかない場合、配列内の行または列の数を取得する(ポータブルな)方法はありません。

その情報をポインタと一緒に渡すか、配列自体で番兵の値を使用する必要があります(C文字列が0ターミネータを使用する方法と同様ですが、文字列の論理サイズしか得られません。占有するアレイ の物理サイズよりも小さい場合があります)。

デニス・リッチーは、Cプログラミング言語の開発で、配列や構造体などの集約型が抽象型を表すだけでなく、メモリまたはディスク領域を占有するビットのコレクションを表すことを望んでいると説明しています。したがって、タイプ内にメタデータはありません。それはあなたがあなた自身を追跡することが期待される情報です。

于 2012-10-19T00:22:36.343 に答える
4
void get_details(int **a)
{
 int row =  ???     // how get no. of rows
 int column = ???  //  how get no. of columns
 printf("\n\n%d - %d", row,column);
}

ポインタのサイズだけが表示されるので、できません。

配列のサイズを渡す必要があります。署名を次のように変更します。

void get_details(int **a, int ROW, int COL)
于 2012-10-18T23:44:41.470 に答える