【问题标题】:Get length of 2-D array in C [closed]在C中获取二维数组的长度[关闭]
【发布时间】:2016-06-08 14:32:46
【问题描述】:

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

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

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

array[n][16];

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

一些测试表明:

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

【问题讨论】:

  • sizeof(pointer) == 4 (32bit, you're on), and sizeof (char[16]) == 16...我为什么不惊讶?
  • “我假设(希望)变量数组已经变成了块数组。” - 如果指针是一个数组,它就不会被称为“指针”,而是“数组”!它甚至不指向二维数组。请学习这些基础知识。这里有很多关于如何声明二维数组的问题(注意:它不是类似于int **array; - 这是初学者的另一个误解!
  • 如果 1) 没有必要或 2) 您不了解 所有 含义或 3) 不接受,则 永远不会他们都!
  • "如何确定n 的值?" - n!
  • I assume (hope) that the variable array has became an array of blocks.... 数组是 NOT 指针,反之亦然。

标签: c arrays pointers multidimensional-array


【解决方案1】:

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 元素数组的大小,而不是 someArray 的大小。

所以当你写的时候

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

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

您可以使用标记值(类似于字符串中的 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 的大小。

【讨论】:

  • 感谢您的努力。 somePointeru_char*。这通过网络捕获指向 bytes 流。我已经了解,该数据的长度取决于您要查找的内容(当然还有捕获长度)。
【解决方案2】:

这是指向array 的指针的大小。它指向数组的第一个元素:

sizeof(array) == 4;

这是array指向的数组的大小,即第一个元素(长度为16的数组):

sizeof(*array) == 16;

n 必须是有限的。 C中没有无限数组。 n 的值必须在使用前定义。

【讨论】:

  • 一般来说,你是对的,但我不明白这怎么能被认为是问题的答案。 :)
  • 如何确定 n 的值?它是有限的吗?你能在我的回答中找到这些问题的答案吗?
猜你喜欢
  • 2011-11-14
  • 2011-04-29
  • 2012-07-30
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多