如果有人知道的话,我只需要一个明确的答案。
我已经检查过类似的问题,但没有一个能够阐明多维数组中发生的情况。所以,
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];
那么 someArray
是 u_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/