c - C 中获取二维数组的长度

标签 c arrays pointers multidimensional-array

如果有人知道的话,我只需要一个明确的答案。
我已经检查过类似的问题,但没有一个能够阐明多维数组中发生的情况。所以,

typedef u_char block[16];
block *array = (block*) somePointer;

我正在尝试将字节流读取为 block 数组。
再说一次,每个元素的大小正好是 1 个字节,所以不要试图用大小和元素让我更加困惑。
我假设(希望)变量 array已经变成了一个 block 数组。

array[n][16];

我如何确定 n 的值??它是有限的吗?

一些测试表明:

sizeof(array) == 4;        // n != sizeof (array)
sizeof(*array) == 16;        // n != sizeof (*array)

最佳答案

TL/DR 版本

您将无法使用array变量在单个表达式中计算n。指向 T 的指针仅指向 T 的单个实例;它无法知道该实例是否是 T 数组的第一个元素。

长版

鉴于声明

typedef u_char block[16];
block *array = (block*) somePointer;

那么以下说法正确:

   Expression        Type           
   ----------        ----           
        array        block * == u_char (*)[16]  // pointer to 16-element array of u_char
       *array        block   == u_char [16]     
 sizeof array        size_t  == sizeof (block *) == sizeof (u_char (*)[16]) == 4 // on your system                   
sizeof *array        size_t  == sizeof (block)   == sizeof (u_char [16])    == 16 

假设声明如下

block someArray[10];

那么 someArrayu_char 的 10x16 数组。您可以通过

确定 someArray 中的行数
sizeof someArray / sizeof *someArray

someArray 中的总字节数 (160) 除以 someArray 单行中的字节数 (16),得出行数(10)。

但是,如果你写

block *array = someArray;

那么您将无法使用array变量确定someArray中的行数。 sizeof array 返回指针的大小,而不是所指向的内容,而 sizeof *array 返回 u_char 的 16 元素数组的大小code>,而不是 someArray 的大小。

所以当你写的时候

block *array = (block*) somePointer; // what is the type of somePointer,
                                     // and is the cast really necessary?

您将array设置为指向block单个实例。您无法从指针本身确定 somePointer 中有多少行 block

您可以使用哨兵值(类似于字符串中的 0 终止符)以某种方式标记最后一行(例如,如果该行的所有元素都设置为 0 或 255 或某种其他模式):

#define TERMINATOR 255
...
bool lastRow( block *b )
{
  bool result = true;
  for ( size_t i = 0; i < sizeof *b; i++ )
    result = result && (b[i] == TERMINATOR);
  return result;
}

int main( void )
{
  ...
  block *array = (block *) somePointer;
  ...
  size_t count = 0;
  while ( !lastRow( array++ ) )
    count++;
  ...
}

当然,只有当一行全部为 255(或 0,或某个其他值)不是有效数据时,这才有效。否则,您需要手动跟踪 somePointer 的大小。

关于c - C 中获取二维数组的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37705478/

相关文章:

c - 打印矩阵关闭代码块

c - 如何在gdb中获取结构的基本数据类型

javascript - indexOf 但对于对象呢?

java - 如何替换数组的值?

c++ - 是否分配给临时对象未定义行为的字段?

c - 如何删除以下 'implicit declaration of function' 警告?

c - 在 LINUX C/C++ 中,哪些系统调用是可中断的(即 errno == EINTR)?

java.util.Properties 多个值 ArrayIndexOutOfBoundsException

c - ARM 程序集 - 是否保证寄存器足够大以容纳指针?

c++ - 如何声明指向 C++11 std::array 的指针?