如何获取由双指针指向的二维数组的大小?

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)?

会发生什么?

2个回答

11

C语言不具备反射机制。

指针不存储任何元数据以指示它们所指向的区域的大小;如果你只有指针,则没有(可移植的)方法检索数组中行数或列数的数量。

你需要将该信息与指针一起传递,或者在数组本身中使用哨兵值(类似于C字符串使用的0终止符,虽然这仅提供了字符串的逻辑大小,可能比占用的数组的物理大小要小)。

C语言发展史中,Dennis Ritchie解释说,他希望像数组和结构体这样的聚合类型不仅表示抽象类型,而且表示将占用内存或磁盘空间的位集合;因此,类型中没有元数据。这是你被期望自己跟踪的信息。


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)

1
其他编程语言(如Fortran或Python(numpy))允许您获取数组大小,仅因为它们在数组中携带额外的数据来跟踪大小。C语言不会这样做,您必须自己跟踪数组大小。 - tpg2114
@Yash 这是不可能的,至少不是可移植的。在某些实现中可能是可能的,但通常不是。我的glibc在malloc.h中提供了size_t malloc_usable_size(void*),但这只会给你可用的大小,而不是你要求的大小,所以它可能会更大(并且大多数情况下确实如此)。 - Daniel Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接